1652: [Usaco2006 Feb]Treats for the Cows

区间DP,逆向递推;

dp[i][j]表示i到j编号能取到的最大值;

状态转移方程为dp[i][j] = max(dp[i][j-1]+v[j]*day, dp[i+1][j]+v[i]*day);

注意,区间dp是随着区间增大逐步更新数据,于是要把“区间”放在循环的最外层。

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int N, dp[2010][2010], v[2010];
 6 
 7 int main() {
 8     cin >> N;
 9     for (int i = 1; i <= N; ++i) cin >> v[i];
10     for (int i = 1; i <= N; ++i) dp[i][i] = v[i] * N;
11     
12     int day = N;
13     for (int sp = 1; sp <= N; ++sp) {
14         day --;
15         for (int st = 1; st <= N; ++ st) {
16             if (st + sp > N) break;
17             dp[st][st+sp] = max(dp[st][st+sp-1] + v[st+sp] * day, dp[st+1][st+sp] + v[st] * day);
18         }
19     }
20     cout << dp[1][N] << endl;
21     return 0;
22 }
View Code

 

posted @ 2016-04-27 22:05  拒绝者\n  阅读(203)  评论(0)    收藏  举报