思路:
- 新类型:区间dp。
- dp[l][r] 代表在区间 [l,r] 内可以取到的最大值,注意,我们是从小到大逐步蚕食增大区间的,根据题意,可知在整个过程中是最后取本区间内的值。
- 注意初始化,枚举时先枚举长度,再根据长度枚举起点。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 2005;
int N;
int A[maxn];
int dp[maxn][maxn];
void SOLVE(){
for(int i=1;i<=N;i++)
dp[i][i] = A[i] * N;
for(int len = 1 ; len < N ; len++)
for(int l = 1 ; l <= N-len ; l++)
dp[l][l+len] = max(dp[l][l+len-1] + A[l+len]*(N-len) , dp[l+1][l+len] + A[l]*(N-len));
return ;
}
int main(){
cin>>N;
for(int i=1;i<=N;i++)
cin>>A[i];
SOLVE();
cout<<dp[1][N]<<endl;
return 0;
}