2017.10.1 互不侵犯king 思考记录

来源:互联网 发布:c语言vector迭代器 编辑:程序博客网 时间:2024/06/09 20:01

、、没想到做的这么顺利

首先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[n][fa[i]][K];}printf("%lld",ans);}



原创粉丝点击