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。
刚开始他的想法是从两头比较,价钱低的那个先卖出去,价钱高的留在后面。但是这样的话如果价钱相同就不知道怎么办了。
我想了一下,用两个数组分别记录从前到后和从后到前两种序列,在第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; }
相关文章推荐
- POJ 3186 Treats for the Cows(区间DP)
- Poj 3186 Treats for the Cows【区间dp】
- 【区间dp】Treats for the Cows POJ - 3186
- poj 3186 Treats for the Cows dp
- POJ 3186 Treats for the Cows (区间DP)
- poj 3186 Treats for the Cows(区间dp)
- 【dp】POJ - 3186 Treats for the Cows
- poj 3186 && bzoj 1652: [Usaco2006 Feb]Treats for the Cows(DP)
- 【POJ 3186 】Treats for the Cows (区间DP)
- POJ 3186 Treats for the Cows(区间dp)
- 区间DP-POJ-3186-Treats for the Cows
- poj 3186 Treats for the Cows (区间DP)
- poj 3186 Treats for the Cows(区间dp)
- POJ-3186 Treats for the Cows( DP )
- POJ 3186 Treats for the Cows(区间DP)
- dp基础8-- O - Treats for the Cows POJ - 3186
- POJ-3186 Treats for the Cows (区间DP)
- 文章标题 POJ 3186 : Treats for the Cows (区间DP)
- POJ 3186 - Treats for the Cows(DP)
- POJ 3186 Treats for the Cows (DP)