其实这个题我也不能算原创几天前看过题解这次没看题解而已
首先,dp[i][j]表示的是i到j的最优解,而且我们可以反着看,就是说随机取一个数乘n,再在他旁边两个数里面选一个乘以n-1,以此类推,因此dp[i][i]=n*a[i],具体可以看代码理解
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[2001];
int dp[2001][2001];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=n;i>=1;i--)
{
dp[i][i]=n*a[i];
for(int j=i+1;j<=n;j++)
{
dp[i][j]=max(dp[i+1][j]+a[i]*(n+i-j),dp[i][j-1]+a[j]*(n+i-j)); //i,j之间包含j-i+1个元素 ,n+i-j
}
}
cout<<dp[1][n]<<endl;
}
这个乘n+i-j可以自己举个例子试一下,不是n+i-j-1