Codeforces Round #574 (Div. 2) C. Basketball Exercise (状态机)
https://codeforces.com/contest/1195
总共有2⋅n个学生,把他们排成了同样大小的两排(每排正好有n个人)。每一排的学生从1到n按从左到右的顺序编号。
现在德米德想选一支球队打篮球。他会从左到右选择玩家,每个被选玩家的指数(不包括第一个被取的)会严格大于之前被选玩家的指数。
为了避免偏向某一行,Demid选择学生的方式是,没有连续选择的学生属于同一行。第一个学生可以在所有2n个学生中选择(没有额外的限制),一个团队可以由任意数量的学生组成。
德米德认为,为了组成一个完美的团队,他应该以这样的方式选择学生,即所有选择的学生的总身高尽可能最大。帮助德米德找到他可以选择的球队中球员的最大可能总身高。
input
5
9 3 5 7 3
5 8 1 4 5
output
29
input
3
1 2 9
10 1 1
output
19
input
1
7
4
output
7
-
状态机:分析它每一步所产生的状态
每次面对两个球员时,可以选择要或者是不要,抑或是两个都不要
这就形成了三种状态 -
注意我在选择某一个球员时,就必须得是前一个挨着的没有选或者是另一行的选了或者是没有选
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=500500;
const int M=2002;
LL a[N],b[N];
int f[N][2][2];
LL dp[N][3];
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
int T=1;
//cin>>T;
while(T--)
{
LL n;
cin>>n;
for(LL i=1;i<=n;i++)
cin>>a[i];
for(LL j=1;j<=n;j++)
cin>>b[j];
for(LL i=1;i<=n;i++)
{
dp[i][0]=max({dp[i-1][0],dp[i-1][1],dp[i-1][2]});//两个都不选的时候
dp[i][1]=max(dp[i-1][0],dp[i-1][2])+a[i];//不选和选择第2个的时候
dp[i][2]=max(dp[i-1][0],dp[i-1][1])+b[i];//不选和选择第1个的时候
}
cout<<max({dp[n][0],dp[n][1],dp[n][2]})<<endl;
}
return 0;
}