/*
区间dp
O - Treats for the Cows
题意:给你一组数,可以选择取最前面的数和最后面的数,第i次取到这个数,
就将总数加上(i*取的数),使总数最大。
题解:dp[i][j] 代表从i取到j的最大总数
dp[i][j] = max(dp[i+1][j]+a[i]*(n+i-j) , dp[i][j-1]+a[j]*(n+i-j));
*/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
using namespace std;
const int N = 2010;
int a[N];
int dp[N][N];
int main()
{
memset(dp,0,sizeof(dp));
int n;
cin >> n;
for(int i = 0; i < n; i++)
cin >> a[i];
for(int len = 0; len < n; len++)
{
for(int i = 0; i+len < n; i++)
{
int l = i, r = i+len;
dp[l][r] = max(dp[l+1][r]+a[l]*(n+l-r),dp[l][r-1]+a[r]*(n+l-r));
}
}
printf("%d\n",dp[0][n-1]);
return 0;
}
【区间dp】POJ 3186 Treats for the Cows
最新推荐文章于 2020-04-01 11:59:59 发布