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
  1. 状态机:分析它每一步所产生的状态
    每次面对两个球员时,可以选择要或者是不要,抑或是两个都不要
    这就形成了三种状态

  2. 注意我在选择某一个球员时,就必须得是前一个挨着的没有选或者是另一行的选了或者是没有选

#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;
}
posted @ 2022-08-03 10:06  Vijurria  阅读(32)  评论(0编辑  收藏  举报