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
",ans);
}

这里写图片描述

原文地址:https://www.cnblogs.com/SiriusRen/p/6532132.html