题意: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;
}