80分求助,wa8,9
查看原帖
80分求助,wa8,9
714900
zyzbldnb楼主2023/1/28 16:17
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
int f[9][(1<<9)+5][82],n,k;
int ge(int t)
{
	int cnt=0;
	for(int i=0;t>>i>0;i++)
		if( (t>>i)&1==1 ) cnt++;
	return cnt;
}
bool check(int st)// 本行判断
{
	return !(st&st>>1); 
}
bool check2(int st,int st2) // 双行之间判断,st当前,st2上一行
{
	 if( st&st2 ) return 0;
	 if( (st<<1)&st2 ) return 0;
	 if( (st>>1)&st2 ) return 0;
	 if( (st2>>1)&st2 ) return 0;//附带把上一行的单行判断
	 return 1;
}
int main()
{
    cin>>n>>k;
    for(int i=0;i<(1<<n);i++)
     if(check(i)) f[0][i][ge(i)]=1;
     
    for(int i=1;i<n;i++)
    {
        for(int j=0;j<(1<<n);j++)// j is 第i行状态
        {
        	if(!check(j)) continue;
        	for(int x=ge(j);x<=k;x++)        //一共放x个(包括当前行i)
        	for(int y=0;y<(1<<n);y++)         // i-1行状态
        	{
        		if( !check2(j,y)) continue;
        		f[i][j][x]+=f[i-1][y][x-ge(j)];
			}
		}
	}
	ll ans=0;
	for(int i=0;i<(1<<n);i++)
	ans+=f[n-1][i][k];
	cout<<ans;
	return 0;
}
2023/1/28 16:17
加载中...