题意:给一个数组v,每次可以取前面的或者后面的,第k次取的v[i]价值为v[i]*k,问总价值最大是多少。
区间dp。
区间dp可以不枚举len 直接枚举i和j即可 见代码

#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; #define maxx 2010 int dp[maxx][maxx]; int main() { int n,v[maxx]; while(scanf("%d",&n)!=EOF) { for(int i = 1;i <= n;i ++) scanf("%d",&v[i]); memset(dp,0,sizeof(dp)); for(int i=n;i>=1;i--) for(int j=i;j<=n;j++) { dp[i][j]=max(dp[i][j],dp[i+1][j]+(n-(j-i))*v[i]); dp[i][j]=max(dp[i][j],dp[i][j-1]+(n-(j-i))*v[j]); } printf("%d ",dp[1][n]); } return 0; }