给你n个数 每一次只取一个数 只能前后两个方向取 第i次取出数的价值为自身价值*i 问最大价值为多少
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; #define N 2002 int dp[N][N]; int a[N]; int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); memset(dp,0,sizeof(dp)); int ans=0; for(int i=0;i<=n;i++) { for(int j=0;j+i<=n;j++) { if(i>0&&j>0)///i表示前取i个数 j同理后取 dp[i][j]表示在(i+j)个数的最大价值 dp[i][j]=max(dp[i-1][j]+a[i]*(i+j),dp[i][j-1]+a[n-j+1]*(i+j)); else if(i>0) dp[i][j]=dp[i-1][j]+a[i]*i; else if(j>0) dp[i][j]=dp[i][j-1]+a[n-j+1]*j; ans=max(ans,dp[i][j]); } } printf("%d ",ans); } return 0; }