您的位置:首页 > 其它

POJ-3186-Treats for the Cows

2017-08-17 15:17 330 查看
题意:

有n个不同价值的东西要卖出,每天只能卖出一个东西,且每次只能卖最后一件或者第一件,东西卖出去的价格=储存天数*本身价值。问怎样卖才能获得最大收益。

思路:

一开始我以为只是简单的先卖两件中的便宜物品,其实这个想法是错的。正确的方法是dp,状态转移方程:dp[i][j]=max(dp[i-1][j]+(i+j)*a[i],dp[i][j-1]+(i+j)*a[n-j+1]);

i代表从前面卖了i个,j代表从后面卖了j个。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[2100][2100],a[2100];
int main(){
int n;
while(scanf("%d",&n)!=EOF){

for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
dp[i][0]=dp[i-1][0]+a[i]*i;
for(int j=1;j<=n;j++)
dp[0][j]=dp[0][j-1]+a[n-j+1]*j;

for(int i=1;i<=n;i++)
for(int j=1;j+i<=n;j++){
//if((i+j)<=n)
dp[i][j]=max(dp[i-1][j]+(i+j)*a[i],dp[i][j-1]+(i+j)*a[n-j+1]);
}
int mx=0;
for(int i=1;i<=n;i++)
for(int j=1;j+i<=n;j++)
if((j+i)==n) mx=max(mx,dp[i][j]);
printf("%d\n",mx);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划 dp