这DP和前面做的那几个不是很一样
状态转移的比较奇怪..
思路就是从左右各拿几个的最优解是固定的
就这么转移了
#include<iostream>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
long long dp[2001][2001];
long long zhi[2001];
int main()
{
int n;
while (cin >> n)
{
for (int a = 1;a <= n;a++)cin >> zhi[a];
memset(dp, 0, sizeof(dp));
//dp[1][0] = zhi[1];
//dp[0][1] = zhi[n];
long long sum = 0;
for (int a = 0;a <= n;a++)
{
for (int b = 0;a+b<=n;b++)
{
if (a != 0&&b!=0)
{
dp[a][b] = max(dp[a - 1][b] + zhi[a] * (a + b), dp[a][b - 1] + (a + b)*zhi[n - b + 1]);
sum = max(sum, dp[a][b]);
}
else if (a == 0 && b != 0)
{
dp[a][b] =max(dp[a][b], dp[a][b - 1] + b*zhi[n - b + 1]);
sum = max(sum, dp[a][b]);
}
else if (a != 0 && b == 0)
{
dp[a][b] =max(dp[a][b],dp[a-1][b] + a*zhi[a]);
sum = max(sum, dp[a][b]);
}
else dp[a][b] = 0;
}
}
cout << sum << endl;
}
return 0;
}