B - Basketball Exercise CodeForces - 1195C

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

发布了97 篇原创文章 · 获赞 3 · 访问量 9452

猜你喜欢

转载自blog.csdn.net/foolishpichao/article/details/97108955