您的位置:首页 > 其它

poj 3186 Treats for the Cows(DP)

2013-07-22 20:42 302 查看
yyf屁颠儿屁颠儿地跟我说他找了一个水DP,看他现在还没有A掉,其实也没那么水,哈?!

刚开始他的想法是从两头比较,价钱低的那个先卖出去,价钱高的留在后面。但是这样的话如果价钱相同就不知道怎么办了。

我想了一下,用两个数组分别记录从前到后和从后到前两种序列,在第k天,dp[i][j]=Max(dp[i-1][j]+k*a[i],dp[i][j-1]+k*b[j])。这样想倒是不错,但是数据规模在2000,如果开三重循环的话提交会TLE。我的1A就是这么没的。我又想了一下,j可以表示成k-i,将三重循环优化成两重循环AC。

#include<stdio.h>
#include<string.h>
#define N 2005
int a
,b
;
int dp

;
int Max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,j,k;
i=1;
j=n;
for(i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
a[i]=x;
b[j--]=x;
}
memset(dp,0,sizeof(dp));
int max=0;
for(k=1;k<=n;k++)
{
for(i=0;i<=k;i++)
{
if(i>0&&k-i>0)
dp[i][k-i]=Max(Max(dp[i-1][k-i]+k*a[i],dp[i][k-i-1]+k*b[k-i]),dp[i][k-i]);
else if(i>0)
dp[i][k-i]=Max(dp[i-1][k-i]+k*a[i],dp[i][k-i]);
else
dp[i][k-i]=Max(dp[i][k-i-1]+k*b[k-i],dp[i][k-i]);
if(dp[i][k-i]>max)
max=dp[i][k-i];
}
}
printf("%d\n",max);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: