[BZOJ]1087: [SCOI2005]互不侵犯King 状态压缩DP
2016-12-15 13:54
423 查看
Description
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。
Input
只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)Output
方案数。Sample Input
3 2Sample Output
16这种题目一看就知道是状态压缩DP,随便搞就是了。
代码:
#include<cstdio> #include<cstring> long long ans=0,f[11][515][83];//f[i][j][k]表示i行状态为j,已经放了k个国王的方案数 int one[515],list[515],len=0; int onenum(int n) { int r=0; while(n!=0) { n=n&(n-1); r++; } return r; } bool check1(int x) { if((x&(x<<1))==0) return true; return false; } bool check2(int x,int y) { if((x&y)!=0) return false; if((x&(y<<1))!=0) return false; if((x&(y>>1))!=0) return false; return true; } int main() { memset(f,0,sizeof(f)); int n,k; scanf("%d%d",&n,&k); for(int i=0;i<(1<<n);i++) if(check1(i)==true) { one[i]=onenum(i); if(one[i]<=k) { list[++len]=i; f[1][i][one[i]]=1; } } for(int i=2;i<=n;i++) { for(int o=0;o<=k;o++) { for(int j=1;j<=len;j++) { int x=list[j]; if(one[x]>o) continue; for(int k=1;k<=len;k++) { int y=list[k]; if(one[x]+one[y]>o) continue; if(check2(x,y)==false) continue; f[i][x][o]+=f[i-1][y][o-one[x]]; } } } } for(int i=0;i<(1<<n);i++) ans+=f [i][k]; printf("%lld",ans); }
f885
相关文章推荐
- [BZOJ 1087][SCOI2005]互不侵犯King:状态压缩DP
- bzoj1087: [SCOI2005]互不侵犯King(状态压缩+Dp)
- bzoj 1087 [SCOI2005]互不侵犯King 状态压缩dp
- BZOJ1087 [SCOI2005]互不侵犯King 状态压缩DP
- 【状态压缩DP】【BZOJ1087】【SCOI2005】互不侵犯king
- [BZOJ 1087][SCOI 2005] 互不侵犯King 状态压缩DP
- BZOJ题目1087: [SCOI2005]互不侵犯King(状态压缩DP)
- 【状态压缩DP】BZOJ1087-[SCOI2005]互不侵犯King
- BZOJ 状态压缩dp 1087: [SCOI2005]互不侵犯King
- BZOJ 1087: [SCOI2005]互不侵犯King 状态压缩 题解
- D 1087: [SCOI2005]互不侵犯King (状态压缩dp)
- BZOJ_P1087&Codevs_P2451 [SCOI2005]互不侵犯King(状态压缩DP)
- 【BZOJ1087】【SCOI2005】互不侵犯King 状态压缩 动态规划 水题 都不用加特技
- Bzoj 1087: [SCOI2005]互不侵犯King(状压DP)
- BZOJ 1087: [SCOI2005]互不侵犯King( 状压dp )
- _bzoj1087 [SCOI2005]互不侵犯King【dp】
- 【BZOJ】1087: [SCOI2005]互不侵犯King(状压dp)
- 【bzoj 1087】[SCOI2005]互不侵犯King 状压dp
- BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP
- BZOJ 1087 [SCOI 2005] 互不侵犯的king (状压DP)