bzoj1087:[SCOI2005]互不侵犯King
阿新 • • 發佈:2019-03-09
namespace 比較 gis for += scoi2005 printf include register
傳送門
設狀態\(f[i][j][k]\)為枚舉到第\(i\)行,放國王的狀態為\(j\),目前一共放了\(k\)個國王
算出來復雜度挺高的,但是剪枝比較niubi,然後就沒了
代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; void read(int &x) { char ch; bool ok; for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1; for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x; } #define rg register const int maxn=2e5+10; int n,m;long long ans,f[10][1<<9][100]; int main() { read(n),read(m); int tot=1<<n;f[0][0][0]=1; for(rg int i=1;i<=n;i++) for(rg int j=0;j<tot;j++) for(rg int t=0;t<=m;t++) if(f[i-1][j][t]) for(rg int k=0;k<tot;k++) if(!(k&(k<<1))&&!(k&j)&&!((k<<1)&j)&&!(k&(j<<1))) { int h=0; for(rg int g=1;g<=n;g++)h+=((k>>(g-1))&1); if(h+t>m)continue; f[i][k][t+h]+=f[i-1][j][t]; } for(rg int i=0;i<tot;i++)ans+=f[n][i][m]; printf("%lld\n",ans); }
bzoj1087:[SCOI2005]互不侵犯King