70WA 已开long long 求助
查看原帖
70WA 已开long long 求助
205782
R浩轩泽Anmicius楼主2020/7/26 15:33
#include<iostream>
#include<cstring>
using std::cin;
using std::cout;
#define N 10
#define signed register int
int n,m,status[N],tot;//方案及方案总数 
long long f[N][2<<N][N*N],ans;
inline int cnt(int x)//统计二进制下1的数量 
{
	int ret=0;
	while(x)
	{
		if(x&1)++ret;
		x>>=1;
	}
	return ret;
} 
inline bool checks(int x)//判断本行是否冲突 
{
	if(x&(x<<1))return false;
	if(x&(x>>1))return false;
	return true;
}
int main()
{
	std::ios::sync_with_stdio(false);
	memset(status,0,sizeof(status));
	memset(f,0,sizeof(f));
	cin>>n>>m;
	for(signed i=0;i<=(1<<n)-1;++i)
	if(checks(i))status[++tot]=i;
	for(signed i=1;i<=tot;++i)//边界条件 
	f[1][status[i]][cnt(status[i])]=1;
	for(signed i=2;i<=n;++i)//行数 
	for(signed j=1;j<=tot;++j)//方案数
	for(signed k=cnt(status[j]);k<=m;++k)//之前国王总数
	for(signed h=1;h<=tot;++h)//上一行方案数(枚举) 
	{
		int x=status[j],y=status[h];
		if((x&y)||(x&(y>>1))||(x&(y<<1)))continue;
		f[i][x][k]+=f[i-1][y][k-cnt(x)];
	} 
	for(signed i=1;i<=tot;++i)
	ans+=f[n][status[i]][m];
	cout<<ans<<'\n';
	return 0;
}

蒟蒻刚学状压,要疯了

2020/7/26 15:33
加载中...