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

时间:2023-03-09 04:30:01
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)

代码如下:

 // 2013/10/26
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 3005
int a[N],b[N],c[N];
int dp[N][];
int main()
{
int n,i;
memset(dp,,sizeof(dp));
scanf("%d",&n);
for(i=;i<=n;i++){
scanf("%d",&a[i]);
}
for(i=;i<=n;i++)
scanf("%d",&b[i]);
for(i=;i<=n;i++)
scanf("%d",&c[i]);
if(n==)
cout<<a[]<<endl;
else
{
dp[][]=b[];
dp[][]=a[];
// dp[i][0]表示i位置时(i-1)没喂过
// dp[i][1]表示i位置时(i-1)喂过
for(i=;i<=n;i++)
{
dp[i][]=max(dp[i-][]+b[i-],dp[i-][]+c[i-]);
//前者顺序n[i],n[i-1],n[i-2],后者顺序n[i-2],n[i],n[i-1]
dp[i][]=max(dp[i-][]+a[i-],dp[i-][]+b[i-]);
//n[i-1],n[i-2],n[i];n[i-2],n[i-1],n[i]
}
int ans=max(dp[n][]+a[n],dp[n][]+b[n]);
cout<<ans<<endl;
}
return ;
}