题意:
给定两个序列a和b,可以选任意的数 但要满足以下规则:连续选择的两个数不能来自同一序列,选择了下标为i的 往后只能选下标比i大的
求选的数和的最大值
思路:
dp[maxn][2][2] 第一维是长度 第二维是序列a还是序列b 第三维是选了还是没选
枚举每个情况,具体看注释
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<vector>
#include<cmath>
#define ll long long
using namespace std;
const int maxn=1e5+5;
ll a[maxn][2],dp[maxn][2][2];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lld",&a[i][0]);
for(int i=0;i<n;i++)
scanf("%lld",&a[i][1]);
dp[0][0][1]=a[0][0];
dp[0][1][1]=a[0][1];
for(int i=1;i<n;i++)
{
dp[i][0][0]=max(max(dp[i-1][0][1],dp[i-1][0][0]),max(dp[i-1][1][0],dp[i-1][1][1]));//第一排第i个人没被选上
dp[i][0][1]=max((dp[i-1][0][0]),max(dp[i-1][1][0],dp[i-1][1][1]))+a[i][0];//第一排第i个人选上了
dp[i][1][0]=max(max(dp[i-1][1][1],dp[i-1][1][0]),max(dp[i-1][0][0],dp[i-1][0][1]));第二排第i个人没被选上
dp[i][1][1]=max((dp[i-1][1][0]),max(dp[i-1][0][0],dp[i-1][0][1]))+a[i][1];//第二排第i个人选上了
}
printf("%lld\n",max(max(dp[n-1][0][0],dp[n-1][0][1]),max(dp[n-1][1][0],dp[n-1][1][1])));//从四种情况挑最大值
return 0;
}