dp
正数第i个,倒数第j个;
dp[i][j]=max(dp[i-1][j]+val[i]*(i+j),dp[i][j-1]+val[n-j+1]*(j+i);
#include <iostream>
#include <cstdio>
using namespace std;
int val[2005];
int dp[2005][2005];
int main()
{
// freopen("in","r",stdin);
int n;
while(cin>>n)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&val[i]);
}
int _max=0;
int i,j;
for(i=0;i<=n;i++)
{
for(j=0;j+i<=n;j++)
{
if(i==0&&j==0)
dp[i][j]=0;
else if(i==0&&j!=0)
dp[i][j]=max(dp[i][j],dp[i][j-1]+val[n-j+1]*(i+j));
else if(i!=0&&j==0)
dp[i][j]=max(dp[i][j],dp[i-1][j]+val[i]*(i+j));
else
dp[i][j]=max(dp[i-1][j]+val[i]*(i+j),dp[i][j-1]+val[n-j+1]*(i+j));
}
}
for(i=0;i<=n;i++)
{
if(_max<dp[i][n-i])
{
_max=dp[i][n-i];
}
}
printf("%d\n",_max);
}
return 0;
}