题意:2n个篮球矮人;每行n个共2行;每第一次可以选任意一行的一个,下一次就只能选另一行了,并且选了第i个选手,(0-i)就都不能选共n个嘛,所以此教练就是,看了第一排就一定会看第二排,反之同理,并且,眼睛只能从左到右瞄,不能反向偏头,(好辛苦的选人啊)
题目链接:https://cn.vjudge.net/contest/313272#problem/B
0代表第一行,1代表第二行
ps:此也是线性DP; 第i,0个人,就只能是(i-1,0)没有被选上,或者(i-1,1)被选上了或者此人没被选上,(i,1)同理;
故多开个【2】,0代表没被选上,[1]代表被选上;
#include <iostream>
#include<algorithm>
#include<stdio.h>
typedef long long int ll;
using namespace std;
const int N=100005;
ll a[N][2]; //此题身高为10^9,故用LONGLONG;
ll dp[N][2][2];//中间的[2]代表行数最后的[2]:0代表over,1代表get;
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][0]=0; dp[0][1][0]=0;
dp[0][0][1]=a[0][0];dp[0][1][1]=a[0][1]; //初始化
for(int i=1;i<n;i++)
{
dp[i][0][1] = max(max(dp[i-1][1][0], dp[i-1][1][1]),dp[i-1][0][0])+a[i][0];//第一排第i个人选上了
dp[i][0][0] = max(dp[i-1][1][1], dp[i - 1][1][0]); //没被选上
dp[i][1][1] = max(max(dp[i-1][0][0], dp[i-1][0][1]),dp[i-1][1][0])+ a[i][1];//第二排第i个人呗选上
dp[i][1][0] = max(dp[i-1][0][1], dp[i-1][0][0]);//没被选上
}
printf("%lld\n",max(max(dp[n-1][0][0],dp[n-1][0][1]),max(dp[n-1][1][1],dp[n-1][1][0])));//从四个里面挑最大的给我上,冲鸭,我的最高身高篮球队
//话说我是一个只看身高的教练
//cout<<<<endl;
return 0;
}