Codeforces - Fragile Bridges

题目链接:Codeforces - Fragile Bridges


向左向右分别dp。
l[i][0]为点i向左走,不会来的最大距离,l[i][1]为回来的最大距离。
r[i][0/1]同理向右。
然后枚举每个点要么是左边不回来,要么是右边不回来,要么是都回来。

AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
#define int long long
using namespace std;
const int N=1e5+10;
int n,a[N],l[N][2],r[N][2],res;
signed main(){
	cin>>n;
	for(int i=2;i<=n;i++)	cin>>a[i];
	for(int i=2;i<=n;i++){
		l[i][0]=max(l[i-1][0],l[i-1][1])+a[i]-(a[i]%2==0);
		if(a[i]>1)	l[i][1]=l[i-1][1]+a[i]-(a[i]%2);
	}
	for(int i=n-1;i>=1;i--){
		r[i][0]=max(r[i+1][0],r[i+1][1])+a[i+1]-(a[i+1]%2==0);
		if(a[i+1]>1)	r[i][1]=r[i+1][1]+a[i+1]-(a[i+1]%2);
	}
	for(int i=1;i<=n;i++)	
		res=max(res,max(max(l[i][0]+r[i][1],l[i][1]+r[i][1]),l[i][1]+r[i][0]));
	cout<<res;
	return 0;
}

你可能感兴趣的:(Codeforces,动态规划)