codeforce1195C Basketball Exercise DP

问题链接(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值