题意在题目描述里面已经给的很详细了,用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][n]);
}
}