4.3 省选模拟赛 序列游戏 dp

avatar
avatar

可以发现 某一段被删除后状态难以表示 也难以链接起来。

考虑暴力 有40分的状压dp 暴力存状态 然后枚举转移即可。最后注意和f[0]这个状态取max 不然一分都没有。

const int MAXN=12;
int f[1<<MAXN];
int a[MAXN],b[MAXN],v[MAXN],w[MAXN];
int n,maxx,ans;
int main()
{
	freopen("1.in","r",stdin);
	//freopen("sequence.out","w",stdout);
	get(n);
	if(n<=10)
	{
		memset(f,0xcf,sizeof(f));
		rep(1,n,i)get(v[i]);
		rep(1,n,i)get(a[i]);
		maxx=(1<<n)-1;
		f[maxx]=0;
		fep(maxx,1,i)
		{
			if(f[i]<-INF)continue;
			int top=0;
			rep(1,n,j)if((i&(1<<(j-1))))b[++top]=a[j],w[top]=(1<<(j-1));
			rep(1,top,j)
			{
				rep(1,top-j+1,k)
				{
					int en=k+j-1;
					int flag=0,s=i;
					rep(k,en,l)
					{
						if(l>k)
						{
							if(abs(b[l]-b[l-1])!=1){flag=1;break;}
							if(l<en)if(b[l]<b[l-1]&&b[l]<b[l+1]){flag=1;break;}
						}
						s=s^w[l];
					}
					if(!flag)f[s]=max(f[s],f[i]+v[j]);
				}
			}
			ans=max(ans,f[i]);
		}
		ans=max(ans,f[0]);
		put(ans);return 0;
	}
}

从上面的分析我们也可以发现难点就在于状态的表示。

猜你喜欢

转载自www.cnblogs.com/chdy/p/12628170.html
4.3
今日推荐