P1896 [SCOI2005] 互不侵犯(状态压缩)


位运算符好麻烦,没打括号被卡了半天
#include<iostream>
#define int long long
using namespace std;
int f[12][100][1<<11];
int s[1<<11];
int num[1<<11];
signed main(){
int n,k;
cin>>n>>k;
int cnt=0;
for(int i=0;i<(1<<n);i++){
if(!(i&(i>>1))){
s[cnt++]=i;
for(int j=0;j<n;j++)num[i]+=(i>>j)&1;
}
}
f[0][0][0]=1;
for(int i=1;i<=n+1;i++){
for(int j=0;j<=k;j++){
for(int a=0;a<cnt;a++){
for(int b=0;b<cnt;b++){
int c=num[s[a]];
if((j>=c)&&(!(s[a]&s[b]))&&(!(s[a]&(s[b]>>1)))&&(!(s[a]&(s[b]<<1)))){
f[i][j][a]+=f[i-1][j-c][b];
}
}
}
}
}
cout<<f[n+1][k][0];
return 0;
}

浙公网安备 33010602011771号