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

题目链接:http://codeforces.com/problemset/problem/358/D

开始题意理解错,整个就跪了= =

题目大意:从1到n的位置取数,取数的得到值与周围的数有没有取过有关,所有数都要取,求最终得到的最大结果

解题思路:dp题,转移方程如下

dp[i][0]=max(dp[i-1][0]+b[i-1],dp[i-1][1]+c[i-1])

dp[i][1]=max(dp[i-1][0]+a[i-1],dp[i-1][1]+b[i-1])

a,b,c分别表示周围没有数,有一个数,有两个数取过的情况。

dp[i][0]表示取i个位置时,i-1没取过的情况。(实际取数的情况,先i,再i-1)

dp[i][1]表示取i个位置时,i-1取过的情况。(实际取数的情况,先i-1,再i)

代码如下:

 1 // 2013/10/26
 2 #include<cmath>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<algorithm>
 7 using namespace std;
 8 #define N 3005
 9 int a[N],b[N],c[N];
10 int dp[N][2];
11 int main()
12 {
13     int n,i;
14     memset(dp,0,sizeof(dp));
15     scanf("%d",&n);
16     for(i=1;i<=n;i++){
17         scanf("%d",&a[i]);
18     }
19     for(i=1;i<=n;i++)
20         scanf("%d",&b[i]);
21     for(i=1;i<=n;i++)
22         scanf("%d",&c[i]);
23     if(n==1)
24             cout<<a[1]<<endl;
25     else
26     {
27         dp[2][0]=b[1];
28         dp[2][1]=a[1];
29         // dp[i][0]表示i位置时(i-1)没喂过
30         // dp[i][1]表示i位置时(i-1)喂过
31         for(i=3;i<=n;i++)
32         {
33             dp[i][0]=max(dp[i-1][0]+b[i-1],dp[i-1][1]+c[i-1]);
34             //前者顺序n[i],n[i-1],n[i-2],后者顺序n[i-2],n[i],n[i-1]
35             dp[i][1]=max(dp[i-1][0]+a[i-1],dp[i-1][1]+b[i-1]);
36             //n[i-1],n[i-2],n[i];n[i-2],n[i-1],n[i]
37         }
38         int ans=max(dp[n][0]+a[n],dp[n][1]+b[n]);
39         cout<<ans<<endl;
40     }
41     return 0;
42 }
View Code
原文地址:https://www.cnblogs.com/wuwing/p/3388983.html