POJ - 3186 Treats for the Cows (区间DP)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ - 3186 Treats for the Cows (区间DP)相关的知识,希望对你有一定的参考价值。

题目链接: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 }

 

以上是关于POJ - 3186 Treats for the Cows (区间DP)的主要内容,如果未能解决你的问题,请参考以下文章