3186Treats for the Cows(区间dp)

题意:给一个数组v,每次可以取前面的或者后面的,第k次取的v[i]价值为v[i]*k,问总价值最大是多少。

区间dp。

区间dp可以不枚举len  直接枚举i和j即可  见代码

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int p[2010];
int dp[2010][2010];
int n;

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&p[i]);
            dp[i][i]=p[i];
        }
        int ans=0;
        for(int i=n;i>=1;i--)
            for(int j=i;j<=n;j++)
        {
           dp[i][j]=max(dp[i+1][j]+p[i]*(n+i-j),dp[i][j-1]+p[j]*(n+i-j));
        }
        printf("%d\n",dp[1][n]);
    }
}
View Code

猜你喜欢

转载自www.cnblogs.com/bxd123/p/10708631.html