【BZOJ1087】【SCOI2005】互不侵犯

来源:互联网 发布:北京sem优化师 编辑:程序博客网 时间:2024/05/16 01:23

题面

这种傻逼题懒得粘贴了。。。

题解

傻逼题
f[i][j][k]表示当前第i列,当前放置状态为j,已经放了k
暴力判断状态合法性,暴力判断转移合法性,然后统计答案

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<set>#include<map>#include<vector>#include<queue>using namespace std;inline int read(){    int x=0,t=1;char ch=getchar();    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();    if(ch=='-')t=-1,ch=getchar();    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();    return x*t;}int N,K;long long f[10][1<<9][101];int main(){    N=read();K=read();    f[0][0][0]=1;    for(int i=1;i<=N;++i)        for(int j=0;j<(1<<N);++j)            for(int k=0;k<(1<<N);++k)            {                if(k&j)continue;                if(k&(j>>1))continue;                if(k&(j<<1))continue;                if(j&(j<<1))continue;                if(j&(j>>1))continue;                if(k&(k>>1))continue;                if(k&(k<<1))continue;                int gg=k,tot=0;                while(gg)tot++,gg-=gg&(-gg);                for(int l=0;l<=K-tot;++l)                    f[i][k][l+tot]+=f[i-1][j][l];            }    long long ans=0;    for(int i=0;i<(1<<N);++i)        ans+=f[N][i][K];    cout<<ans<<endl;    return 0;}
原创粉丝点击