题意:给一个数组v,每次可以取前面的或者后面的,第k次取的v[i]价值为v[i]*k,问总价值最大是多少。
区间dp。
区间dp可以不枚举len 直接枚举i和j即可 见代码
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int p[2010]; int dp[2010][2010]; int n; int main() { while(scanf("%d",&n)!=EOF) { memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { scanf("%d",&p[i]); dp[i][i]=p[i]; } int ans=0; for(int i=n;i>=1;i--) for(int j=i;j<=n;j++) { dp[i][j]=max(dp[i+1][j]+p[i]*(n+i-j),dp[i][j-1]+p[j]*(n+i-j)); } printf("%d\n",dp[1][n]); } }View Code