状压 DP
参考资料
例题
在 的棋盘里面放 个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 个格子。Code (1)
#include <bits/stdc++.h>using namespace std;using ll=long long;const int N=10;ll f[N][N*N][1<<N];int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n,x; cin>>n>>x; f[0][0][0]=1; for(int i=1;i<=n;i++) { for(int l=0;l<=x;l++) { for(int j=0;j<1<<n;j++) { if(l<__builtin_popcount(j))continue; if(j&j>>1)continue; for(int k=0;k<1<<n;k++) { if(j&k<<1||j&k||j&k>>1)continue; f[i][l][j]+=f[i-1][l-__builtin_popcount(j)][k]; } } } } ll ans=0; for(int i=0;i<1<<n;i++)ans+=f[n][x][i]; cout<<ans<<'\n'; return 0;}