问题链接(https://codeforces.com/problemset/problem/1195/C)
问题描述
有两排学生,两组序号都是从左到右为1到n,篮球教练想从中选出一些人来组建出一支身高和最高的队伍,人数不限,但选人方式有规则,从左往右选,他不会连续从同一排里选择2个人,也就是如果上一次选择了学生是第一排的,那么这次就不会在第一排中选,同理第二排也是,而且可以选择不选。
问题分析
因为在面对序号为i的两个学生的时候,为使在考虑了前i个学生的时候身高和最大,那么要求考虑了前i-1个学生的身高和要是最大的。如果上一次选择的是第一排的学生,那么这一次只能选择第二排的学生,或者不选。反过来说就是如果这次要选择第一排的,那么要求面对前i-1人时第二排的答案最优,求解时加上第一排第i个学生的身高,如果这次要选择不选,那么要求面对前i-1人时第一排的答案最优,否则面对第i个人的时候不是最优解,那么在选择这两种方式的时候选择大的就是这一次的最优解。同理,第二排也是这样考虑的。两排都同时进行一次DP,最后取两者中大的即可。
代码如下
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll h1[N],h2[N];
ll f[N],g[N];
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int i,n;
cin>>n;
for(i=1;i<=n;i++) cin>>h1[i];
for(i=1;i<=n;i++) cin>>h2[i];
f[0]=g[0]=0;
for(i=1;i<=n;i++){
f[i]=max(f[i-1],g[i-1]+h1[i]);
g[i]=max(g[i-1],f[i-1]+h2[i]);
}
cout<<max(f[n],g[n])<<endl;
return 0;
}