求助简单区间dp题,模拟赛AC实测WA
查看原帖
求助简单区间dp题,模拟赛AC实测WA
344016
wurzang楼主2020/7/8 14:19

fl,r,0/1,0/1f_{l,r,0/1,0/1} 表示区间 [l,r][l,r] ,当 AA 先取 / BB 先取 时,A/BA / B 所得的最大值。

转移显然。具体看代码。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll sum[105],f[105][105][2][2];
int pos[105][105][2];
void dp(int l,int r,int type){
	if(l>r)return;
	if(pos[l][r][type]) return;
	pos[l][r][type]=1;
	if(l+1==r){
		f[l][r][type][type]=max(sum[l]-sum[l-1],sum[r]-sum[r-1]);
		f[l][r][type][type^1]=min(sum[l]-sum[l-1],sum[r]-sum[r-1]);
		return;
	}
	if(l==r) return f[l][r][type][type]=sum[r]-sum[l-1],f[l][r][type][type^1]=0,void(0);
	f[l][r][type][type]=-0x3f3f3f3f3f3f3f3f;
	for(int i=l;i<=r;++i){
		dp(i+1,r,type^1);
		//if(l==1&&r==4) cout<<i+1<<" "<<r<<" "<<f[i+1][r][type]<<" "<<f[i+1][r][type^1]<<" "<<sum[i]-sum[l-1]<<endl; 
		if(f[i+1][r][type^1][type]+sum[i]-sum[l-1]>f[l][r][type][type])
			f[l][r][type][type]=f[i+1][r][type^1][type]+sum[i]-sum[l-1],
			f[l][r][type][type^1]=f[i+1][r][type^1][type^1];
	}
	for(int i=r;i>=l;--i){
		dp(l,i-1,type^1);
		if(f[l][i-1][type^1][type]+sum[r]-sum[i-1]>f[l][r][type][type])
			f[l][r][type][type]=f[l][i-1][type^1][type]+sum[r]-sum[i-1],
			f[l][r][type][type^1]=f[l][i-1][type^1][type^1];
	}
}
int main(){
//	freopen("farcry.in","r",stdin);
//	freopen("farcry.out","w",stdout);
	int n;
	while(1){
		scanf("%d",&n);
		if(n==0) break;
		for(int i=1;i<=n;++i)
			scanf("%lld",&sum[i]),sum[i]=sum[i-1]+sum[i];
		memset(pos,0,sizeof(pos));
		memset(f,0,sizeof(f));
		dp(1,n,0);
		printf("%lld\n",f[1][n][0][0]-f[1][n][0][1]);
	}
	return 0;
}
2020/7/8 14:19
加载中...