BZOJ 1087 状压DP
水题,, 但是被卡了一会儿
woc一行内还能相互攻击啊。。。
竟然没想到,,,,,,
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
int f[11][111][1111],n,K,cnt[1111],ans;//第i行 j个国王 方案为k
bool check(int x,int y){return !(x&y)&&!(x&(y*2))&&!((x*2)&y)&&!(x&(x*2))&&!(y&(y*2));}
signed main(){
scanf("%lld%lld",&n,&K);
for(int i=1;i<(1<<n);i++)
for(int j=0;j<n;j++)
if(i&(1<<j))cnt[i]++;
f[0][0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<=K;j++)
for(int l=0;l<(1<<n);l++)
if(j>=cnt[l])
for(int k=0;k<(1<<n);k++)
if(check(k,l))
f[i][j][l]+=f[i-1][j-cnt[l]][k];
for(int k=0;k<(1<<n);k++)ans+=f[n][K][k];
printf("%lld\n",ans);
}