AT_joi2015ho_b (dp思想)

难度2

比较有意思的dp题

首先发现这就是将一个环从中间一点一点剥开的过程。其次观察到joi取时右端点减左端点为偶数,ioi取时为奇数,所以一次一次dp即可。

看到这种题时,发现有环,就要想到双倍延长再模拟一下题意,手玩一下即可

// LUOGU_RID: 117752061
#include<bits/stdc++.h>
using namespace std;
long long n,a[4005],dp[4005][4005],maxx=-1;
long long _max(long long x,long long y){
	if(x>y) return x;
	else return y;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		maxx=_max(maxx,a[i]);
		a[i+n]=dp[i][i]=dp[i+n][i+n]=a[i];
	}
	dp[0][0]=a[0]=a[n];
	dp[2*n][2*n]=a[2*n]=a[1];
	for(int l=2;l<=n;l++){
		for(int i=1;i<=2*n-l;i++){
			int j=l+i-1;
			if(l%2==1){//joi
				dp[i][j]=_max(dp[i+1][j]+a[i],dp[i][j-1]+a[j]);
			}
			else{//
				if(a[i]>a[j+1]) dp[i][j]=_max(dp[i][j],dp[i+1][j]);
				if(a[j]>a[i-1]) dp[i][j]=_max(dp[i][j],dp[i][j-1]);
			}
			maxx=_max(maxx,dp[i][j]);
		}
	}
	cout<<maxx<<endl;
	
	return 0;
}
posted @   wuhupai  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示