Codeforces Round #208 (Div. 2)D. Dima and Hares

原题连接:http://codeforces.com/contest/358/problem/D

题目大意:有n个兔子排成一排,给第i个兔子喂食后,在其左右两只兔子均未被喂食是获得ai的愉悦值,有一个被喂食后获得bi的愉悦值,两只都被喂食过会获得ci的愉悦值,求喂过所有的兔子后获得的最大愉悦值。
解题思路:可以采用dp思想

dp[i][0]表示第i个兔子比第i-1个兔子后喂食,前i-1个兔子获得的最大愉悦值

dp[i][1]表示第i个兔子比第i-1个兔子先喂食,前i-1个兔子获得的最大愉悦值

cst[k][i]表示输入矩阵的第k行,对应的收益值,具体背景参考题目描述。

转移方程: 分别考虑i-1比i-2是先喂还是后喂

dp[i][0]= max(dp[i-1][0]+joy[1][i-1],dp[i-1][1]+joy[0][i-1]);

dp[i][1]= max(dp[i-1][0]+joy[2][i-1],dp[i-1][1]+joy[1][i-1]);

边界条件:(边界条件可以放入转移方程中,参考代码)

dp[1][0]=cst[0][0]; 1比0后喂,考虑0的收益。
dp[1][1]=cst[1][0]; 1比0先喂,考虑0的收益。

思路来源:https://blog.csdn.net/kevinkitty_love/article/details/14002835

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<algorithm>
 6 #include<vector>
 7 #include<queue>
 8 #include<stack>
 9 #include<map>
10 #include<set>
11 #include<cmath>
12 using namespace std;
13 #define ll long long
14 #define ull unsigned long long
15 #define ldb long double
16 #define db double
17 #define fi first
18 #define se second
19 #define INF 0x3f3f3f3f
20 #define endl "\n"
21 #define rush() int T;cin>>T;while(T--)
22 #define mem(a,b) memset((a),(b),sizeof(a))
23 const db pi = acos((db)-1);
24 const ll MAXN = 3000;
25 const ll mod = 1e9+7;
26 
27 int dp[MAXN+2][2];
28 int joy[3][MAXN+2];
29 
30 int main()
31 {
32     int n;
33     scanf("%d",&n);
34     for(int j=0;j<3;j++)
35     {
36         for(int i=0;i<n;i++)
37         {
38             scanf("%d",&joy[j][i]);
39         }
40     }
41     
42     dp[0][0]=-INF;
43     dp[0][1]=0;
44     
45     for(int i=1;i<=n;i++)
46     {
47         dp[i][0]= max(dp[i-1][0]+joy[1][i-1],dp[i-1][1]+joy[0][i-1]);
48         dp[i][1]= max(dp[i-1][0]+joy[2][i-1],dp[i-1][1]+joy[1][i-1]);
49     }
50     
51     printf("%d\n",dp[n][0]);
52     
53     return 0;
54 }

 

posted @ 2019-05-26 21:55  Ogreee  阅读(192)  评论(0编辑  收藏  举报