求助!
查看原帖
求助!
882092
zMinYu楼主2023/5/19 16:15

只有 10 pts

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll dp[15][85][1500];
ll kings[1500],cnt[1500];
int num=0,n,k;
void Init()
{
	//一个一个找下去,判断是否符合一行内的限制,符合就记下来。 
	int maxs=1<<n;
	//这个表示符合条件的数的数量。 
	for(int i=0;i<=maxs;i++)
	{
		if(((i&(i<<1))==0)&&((i&(i>>1))==0))//符合条件 
		{
			cnt[++num]=i;
			int S=i;
			while(S>0)
			{
				if(S%2==1) kings[num]++;
				S>>=2;
			} 
		}
	}
	dp[0][0][0]=1;
	//有一个方案:考虑到第0行时,一个王都不放的情况。 
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>k;
	Init(); 
	for(int i=1;i<=n;i++)//枚举行
	{
		for(int j=1;j<=num;j++)//第i行的状态 
		{
			for(int q=1;q<=num;q++)//第i-1行的状态
			{
				int s1=cnt[j],s2=cnt[q];
				if((s1&s2)==0&&((s1<<1)&s2)==0&&(s1&(s2<<1))==0)
				{
					for(int l=kings[j];l<=k;l++)
					{	
						dp[i][l][s1]+=dp[i-1][l-kings[j]][s2];
					}
				}
			} 
		}
	} 
	ll ans=0;
	for(int i=1;i<=num;i++)
	{
		ans+=dp[n][k][cnt[i]];
	}
	cout<<ans;
	return 0;
}
2023/5/19 16:15
加载中...