您的位置:首页 > 其它

2017.10.1 互不侵犯king 思考记录

2017-10-01 09:19 211 查看
、、没想到做的这么顺利

首先n<=⑨..

所以状压这个⑨

然后枚举状态转移累加即可

f【行数】【最上层排布情况】【已经用了几个】

最后    Σf【n】【i】【k】   0<=i<2^n 即是答案

注:long long

码:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long f[11][1050][180],er[55],K,i,j,n,l,ans,cnt,fa[1050],fags[1050],geshu,k;

int main()
{
scanf("%lld%lld",&n,&K);
//预处理
int sx=pow(2,n);
er[0]=1;
for(i=1;i<=9;i++)
er[i]=er[i-1]*2;
for(i=0;i<sx;i++)
{
if(!(i&(i<<1))&&!(i&(i>>1)))
{geshu=0;
for(j=0;j<=9;j++)
{
if(i&er[j])++geshu;
}
fa[++cnt]=i;
fags[cnt]=geshu;
}
}
f[0][0][0]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=cnt;j++)//枚举上一个状态
for(k=0;k<=K;k++)//枚举上一个状态放的个数
{
for(l=1;l<=cnt;l++)
{
if(!(fa[l]&fa[j])&&!(fa[l]&(fa[j]<<1))&&!(fa[l]&(fa[j]>>1)))
{
f[i][fa[l]][k+fags[l]]+=f[i-1][fa[j]][k];
}
}
}
}
for(i=1;i<=cnt;i++)
{
ans+=f
[fa[i]][K];
}
printf("%lld",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: