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 }

 

posted @ 2017-08-09 21:00  Flowersea  阅读(241)  评论(0编辑  收藏  举报