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

题目链接
在这里插入图片描述
在这里插入图片描述
思路:做这个题要理解就是喂兔子的时候最终不一定是1到n顺序着喂的,a,b,c数组是告诉你如果这样操作的话开心值是多少,所以我们定义dp【i】【0】【0】代表当前喂第i只兔子,这只兔子左右两边的兔子此时都没有喂的最大开心值,dp【i】【1】【0】代表当前喂第i只兔子,这只兔子左边的兔子此时都已经喂了,右边的没喂的最大开心值,dp【i】【1】【1】代表当前喂第i只兔子,这只兔子左边的兔子没有喂,右边的的喂了的最大开心值,dp【i】【2】【0】代表当前喂第i只兔子,这只兔子左右两边的兔子此时都已经喂的最大开心值。可以仔细思考一下这个转移很妙,解释一下第三个转移,此时正在喂第i只兔子且左边的没有喂,那么它的转移就是左边i-1右边已经喂了(这里解释一下,当我喂第i只得时候,i-1没有喂是不是就说明当我喂i-1得时候i已经喂了)就是dp【i-1】【1】【1】和i-1的左右都已经喂了dp【i-1】【2】【0】。

#include<bits/stdc++.h>
using namespace std;
const int maxn=3e3+1;
int n,dp[maxn][3][3],a[3][maxn];
int main()
{
	scanf("%d",&n);
	for(int i=0;i<3;++i) for(int j=1;j<=n;++j) scanf("%d",&a[i][j]);
	dp[1][0][0]=a[0][1];
	dp[1][1][1]=a[1][1];
	for(int i=2;i<=n;++i)
	{
		dp[i][0][0]=max(dp[i-1][2][0]+a[0][i],dp[i-1][1][1]+a[0][i]);
		dp[i][1][0]=max(dp[i-1][0][0]+a[1][i],dp[i-1][1][0]+a[1][i]);
		dp[i][1][1]=max(dp[i-1][1][1]+a[1][i],dp[i-1][2][0]+a[1][i]);
		dp[i][2][0]=max(dp[i-1][1][0]+a[2][i],dp[i-1][0][0]+a[2][i]);
	}
	printf("%d\n",max(dp[n][1][0],dp[n][0][0]));
 } 
发布了328 篇原创文章 · 获赞 1 · 访问量 9091

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/105230028