记录编号 543684 评测结果 AAAAAAAAAA
题目名称 放国王 最终得分 100
用户昵称 Gravatar瑆の時間~無盡輪迴·林蔭 是否通过 通过
代码语言 C++ 运行时间 0.001 s
提交时间 2019-10-08 16:11:38 内存使用 2.25 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
#define int long long int
int s[1<<10+1],c[1<<10+1],dp[11][1<<10+1][51];
int n,k;
void DFS(int H,int now,bool last,int cnt)
{
	//DFS处理某一横行可能出现的所有情况
	//H代表处理到第H位,now代表当前状态,last代表上一位的摆放状态
	//cnt代表已放棋子数 
	if(H==n)
	{
		s[++s[0]]=now;
		c[s[0]]=cnt;
		return;
	}
	DFS(H+1,now*2,0,cnt);
	if(!last)
		DFS(H+1,now*2+1,1,cnt+1);
}
int LINYIN()
{
	freopen("placeking.in","r",stdin);
	freopen("placeking.out","w",stdout);
	scanf("%lld%lld",&n,&k);
	DFS(0,0,0,0);
	dp[0][1][0]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=s[0];j++)
		{
			for(int sk=c[j];sk<=k;sk++)
			{
				for(int l=1;l<=s[0];l++)
				{ 
					if(c[j]+c[l]<=sk&&((s[j]&s[l])==0)&&((s[j]&(s[l]*2))==0)&&((s[j]&(s[l]/2))==0))
					{
						dp[i][j][sk]+=dp[i-1][l][sk-c[j]];
					}
				}
			} 
		} 
	}
	int ans=0;
	for(int i=1;i<=s[0];i++)
	{
		ans+=dp[n][i][k];
	}
	printf("%lld",ans);
	return 0;
}
int LWH=LINYIN();
signed main()
{
	;
}