Codeforces Round #208 (Div. 2) D. Dima and Hares DP
链接:
http://codeforces.com/contest/358/problem/D
题意:
给出n个数,每个数取走的贡献与相邻的数有关,如果取这个数的时候,左右的数都还没被取,那么权值为a,如果左右两个数有一个被取走了,那么权值为b,如果左右两个数都被取走了,那么权值为c,求取取走全部数的最大值。
题解:
定义状态:
dp[i][1][0]表示选第i时,相邻的数有一个被取走,这个数在当前数左侧。
dp[i][1][1]表示选第i时,相邻的数有一个被取走,这个数在当前数右侧。
dp[i][2][0]表示选第i时,相邻的数都被取走了
dp[i][0][0]表示选第i时,相邻的数都没被取走
代码:
31 int n; 32 int a[MAXN], b[MAXN], c[MAXN]; 33 int dp[MAXN][3][2]; 34 35 int main() { 36 ios::sync_with_stdio(false), cin.tie(0); 37 cin >> n; 38 rep(i, 0, n) cin >> a[i]; 39 rep(i, 0, n) cin >> b[i]; 40 rep(i, 0, n) cin >> c[i]; 41 memset(dp, 0, sizeof(dp)); 42 dp[0][0][0] = a[0]; 43 dp[0][1][1] = b[0]; 44 dp[0][1][0] = dp[0][2][0] = -INF; 45 rep(i, 1, n) { 46 dp[i][0][0] = max(dp[i - 1][1][1], dp[i - 1][2][0]) + a[i]; 47 dp[i][1][0] = max(dp[i - 1][1][0], dp[i - 1][0][0]) + b[i]; 48 dp[i][1][1] = max(dp[i - 1][1][1], dp[i - 1][2][0]) + b[i]; 49 dp[i][2][0] = max(dp[i - 1][1][0], dp[i - 1][0][0]) + c[i]; 50 } 51 cout << max(dp[n - 1][0][0], dp[n - 1][1][0]) << endl; 52 return 0; 53 }