翻译:
最后,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;
}