Codeforces Round #574 (Div. 2) C. Basketball Exercise

翻译:

最后,SIS已经开放了一个篮球场,所以Demid决定举办一个篮球训练课程。有2个⋅𝑛的学生参加了Demid的练习课,他将他们排成两排,大小相同(每排正好有𝑛人)。学生按从左到右的顺序,每一行从1到𝑛编号。


现在德米德想选一个队去打篮球。他将从左到右选择球员,每个被选中球员的索引(不包括第一个被选中的球员)将严格大于前一个被选中球员的索引。为了避免优先选择某一行,Demid选择学生的方式是,连续选择的学生都不属于同一行。第一个学生可以从所有2名𝑛学生中选择(没有额外的限制),一个团队可以由任意数量的学生组成。

Demid认为,为了组成一个完美的团队,他应该这样选择学生,所有被选的学生的总身高是尽可能大的。帮助Demid找到他可以选择的队伍中球员的最大可能的总身高。

输入
输入的第一行包含单个整数𝑛(1≤𝑛≤105)——每一行的学生人数。

第二行输入包含𝑛整数ℎ1,1,ℎ1,2,…,ℎ1,𝑛(1≤ℎ1,𝑖≤109),ℎ1,𝑖𝑖-th学生的高度在第一行。

第三行输入包含𝑛整数ℎ2 1,ℎ2,2,…,ℎ2,𝑛(1≤ℎ2,𝑖≤109),ℎ2,𝑖𝑖-th学生的高度在第二行。

输出
打印一个整数——Demid可以选择的队伍中球员的最大可能总身高。

例子
inputCopy
5
9 3 5 7 3
5 8 1 4 5
outputCopy
29
inputCopy
3.
1 2 9
10 1 1
outputCopy
19
inputCopy
1
7
4
outputCopy
7
请注意
在第一个例子中,Demid可以选择如下的团队:


在第二个例子中,Demid可以选择如下的团队:

思路:

动态规划,状态转移,当前的由同一行的上一个转移而来,或者由另一行的上个加上当前的。

代码:

#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <stdio.h>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<tuple>
#include<numeric>
using namespace::std;
typedef long long  ll;
inline __int128 read(){
    __int128 x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9'){
        if(ch == '-')
            f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9'){
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}
inline void print(__int128 x){
    if(x < 0){
        putchar('-');
        x = -x;
    }
    if(x > 9)
        print(x / 10);
    putchar(x % 10 + '0');
}
int n;
ll a[100005],b[100005];
ll dp[100005][2];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(); cout.tie();
    cin>>n;
    for (int i =1; i<=n; i++) {
        cin>>a[i];
    }
    for (int i =1; i<=n; i++) {
        cin>>b[i];
    }
    for (int i=1; i<=n; i++) {
        dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i]);
        dp[i][1]=max(dp[i-1][1],dp[i-1][0]+b[i]);
    }
    printf("%lld\n",max(dp[n][1], dp[n][0]));
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值