您的位置:首页 > 其它

POJ 3186 Treats for the Cows

2013-05-13 10:47 274 查看
题意在题目描述里面已经给的很详细了,用dp[i][j]表示从i~j的区间选择所能获得的最大值。

状态转移方程也不难:

dp[i][j] = max(dp[i+1][j] + v[i]*a, dp[i][j-1] + v[i]*a);

a是指v[i]的age,显然 a = n - j + i .

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn = 2020;
int dp[maxn][maxn], n, v[maxn], a;

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