Codeforces 358D Dima And Hares DP

点击打开链接

题意:n件物品,每件物品只选一次,选的顺序不同 获得的价值也不同,
选一件物品时,其相邻两件没选价值为a[i],相邻两件选了一件时价值为b[i],相邻两件都被选时价值为c[i]
n<=3000,a[i],b[i],c[i]<=1e5 问最大价值?


每件物品有3种状态,根据其相邻选择顺序来确定其状态.注意边界关系..
设dp[i][0/1][s] 前i列 最后一列状态为s && 最后一列比前一列早/晚选 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double eps=1e-10;
const int inf=0x3f3f3f3f;
const int N=2e5+20;
int n,a[N],b[N],c[N];
int dp[N][2][3]; 
//
int main()
{
	while(cin>>n)
	{
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		for(int i=1;i<=n;i++)
			scanf("%d",&b[i]);
		for(int i=1;i<=n;i++)
			scanf("%d",&c[i]);
		c[1]=c[n]=0;	
		memset(dp,0,sizeof(dp));
		if(n==1)
		{
			cout<<a[1]<<endl;
			continue;
		}
	//	cout<<endl;
		for(int i=1;i<=n;i++)
		{
			//dp[i][1][0] 不存在 
			dp[i][0][0]=max(dp[i-1][0][1],dp[i-1][1][2])+a[i];
			
			
			dp[i][0][1]=max(dp[i-1][1][2],dp[i-1][0][1])+b[i];
			if(i==2)
				dp[i][1][1]=a[1]+b[2];
			else	
				dp[i][1][1]=max(dp[i-1][0][0],dp[i-1][1][1])+b[i];
			if(i==2)
				dp[i][1][2]=dp[1][0][0]+c[i];
			else
				dp[i][1][2]=max(dp[i-1][0][0],dp[i-1][1][1])+c[i];
		
			//cout<<dp[i][0][0]<<' '<<dp[i][0][1]<<' '<<dp[i][1][1]<<' '<<dp[i][1][2]<<endl;
		}
		int ans=0;
		ans=max(dp[n][0][0],dp[n][1][1]); 
		cout<<ans<<endl;
	}	
	return 0;
}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值