[SGU223]Little Kings(状压DP)

随便DP一下

Code

 

#include <cstdio>
int sta[150],cnt[150],tp,n,k;
long long dp[12][144][150],Ans;
int main(){
	scanf("%d%d",&n,&k);
	for(int i=0;i<(1<<n);++i)if(!(i&(i<<1))&&!(i&(i>>1)))sta[++tp]=i;
	for(int i=1;i<=tp;++i)for(int x=sta[i];x;x&=(x-1),++cnt[i]);
	for(int i=1;i<=tp;++i)dp[1][cnt[i]][i]=1;
	for(int i=1;i<n;++i)for(int j=0;j<=k;++j)
		for(int k=1;k<=tp;++k)if(dp[i][j][k])
			for(int x=1;x<=tp;++x)
				if(!(sta[x]&sta[k])&&!((sta[x]<<1)&sta[k])&&!((sta[x]>>1)&sta[k]))
						dp[i+1][j+cnt[x]][x]+=dp[i][j][k];
	for(int i=1;i<=tp;++i)Ans+=dp[n][k][i];
	printf("%lld\n",Ans);
}

 

posted @ 2018-07-27 20:59  void_f  阅读(211)  评论(0编辑  收藏  举报