题目链接:http://poj.org/problem?id=3186
题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值。
题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程:
dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k)
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 const int N=2222; 6 int dp[N][N],value[N]; 7 8 int main(){ 9 int n; 10 cin>>n; 11 for(int i=1;i<=n;i++) cin>>value[i]; 12 for(int i=n;i>=1;i--){ 13 for(int j=i;j<=n;j++){ 14 dp[i][j]=max(dp[i+1][j]+value[i]*(n+i-j),dp[i][j-1]+value[j]*(n+i-j)); 15 } 16 } 17 cout<<dp[1][n]<<endl; 18 return 0; 19 }
时间: 2024-10-14 01:12:16