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 }

浙公网安备 33010602011771号