改了半天了还是有bug,好像遇到玄学了(求大佬雷普
查看原帖
改了半天了还是有bug,好像遇到玄学了(求大佬雷普
392818
Mit5026楼主2023/4/23 11:21
#include<bits/stdc++.h>
using namespace std;
#define bp __builtin_popcount//一个能以O(1)的复杂度求出整数二进制里面1的个数的内建函数

//dp[i][idstate][k]: 只考虑前i行,第i行状态编号为idstate,使用了k个国王的情况
long long dp[10][1000][100]; 
long long sta[2000];
int top=0;

int n,k;

int main(){
	scanf("%d%d",&n,&k);
	for(int s=0;s<=(1<<n)-1;s++){
		if((((s<<1)|(s>>1))&s)==0) sta[++top]=s;
	}
//	for(int ids=0;ids<=top;ids++){
//		dp[1][ids][bp(sta[ids])]=1;
//	}
	dp[0][0][0]=1;
	for(int i=1;i<=n;i++){
		for(int ids=1;ids<=top;ids++){//ids:本行状态编号 
		
			int st=sta[ids];
			
			for(int idr=1;idr<=top;idr++){//idr:上行状态编号 
			
				int str=sta[idr];
				
				if(((str|(str<<1)|(str>>1))&st)==0){
					for(int j=0;j<=k;j++){
						if(j-bp(st)>=0)
							dp[i][ids][j]+=dp[i-1][idr][j-bp(st)];
					}
				}
			}
		}
	}
	long long ans=0;
	for(int i=1;i<=top;i++) ans+=dp[n][i][k];
	printf("%lld\n",ans);
	return 0;
}
2023/4/23 11:21
加载中...