SCOI2005——互不侵犯King(状压DP)
来源:互联网 发布:win7注册表修改mac地址 编辑:程序博客网 时间:2024/05/21 01:28
1087: [SCOI2005]互不侵犯King
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 806 Solved: 445
[Submit][Status][Discuss]
Description在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。
Input
只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)
Output
方案数。
Sample Input
3 2
Sample Output
16
解析:
状压DP入门题,用f[I][J][K]三元组来存,表示第i行,已经放置了j个国王,当前状态为k时的方案数。。。
枚举状态,用ok函数来判断当前状态是否可行(不能相邻),用check函数来判断相邻两行是否兼容。。。
代码:
#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int n,m,tol;bool vis[1<<9][1<<9];long long f[15][11*11][1<<11];//f[i][j][k]表示第i行,已经放置了j个国王,当前状态为k时的方案数;void readdata(){ freopen("king.in","r",stdin); freopen("king.out","w",stdout); scanf("%d%d",&n,&m); tol=(1<<n)-1;}bool check(int s1,int s2) //s2-->s1是否可行{ int i,x,j,k,l; for(i=0;i<n;i++) { x=(s1>>i)&1; j=(s2>>(i-1))&1; k=(s2>>i)&1; l=(s2>>(i+1))&1; if((x&j)==1)return 0; if((x&k)==1)return 0; if((x&l)==1)return 0; } return 1;}int cal(int x)//计算每行1的个数{ int res=0; while(x) { res+=x&1; x>>=1; } return res;}bool ok(int x)//判断当前状态是否可行(不能相邻){ int j,k,l; for(int i=1;i<=n;i++) { j=(x>>i)&1; k=(x>>(i-1))&1; l=(x>>(i+1))&1; if((j&k)==1) return 0; if((j&l)==1) return 0; } return 1;}void pt(int s) //调试程序时输出所有状态。。。{ int a[15]; for(int i=1;i<=n;i++) { a[i]=s&1; s>>=1; } for(int i=n;i>=1;i--) printf("%d",a[i]); puts("");}void init(){ for(int i=0;i<=tol;i++) { f[1][cal(i)][i]=1; } for(int i=0;i<=tol;i++) for(int j=0;j<=tol;j++) if(ok(i) && ok(j) && check(i,j)) { // pt(j);// pt(i);// printf("\n"); vis[i][j]=true;//相邻状态可行就标记为true }}void work(){ for(int i=2;i<=n;i++) for(int k=0;k<=tol;k++) for(int x=0;x<=tol;x++) for(int j=0;j<=m;j++) { if(vis[k][x] && j>=cal(k) ) f[i][j][k]+=f[i-1][j-cal(k)][x]; } long long ans=0; for(int i=0;i<=tol;i++) ans+=f[n][m][i]; cout<<ans;}int main(){ readdata(); init(); work(); return 0;}
- SCOI2005——互不侵犯King(状压DP)
- [BZOJ1087][SCOI2005]互不侵犯King(状压dp)
- 【BZOJ1087】【SCOI2005】互不侵犯King(状压dp)
- bzoj1087 [SCOI2005]互不侵犯King(状压dp)
- [bzoj1087]: [SCOI2005]互不侵犯King(状压dp)
- 【状压DP】[SCOI2005]互不侵犯 king
- SCOI2005互不侵犯King 状压Dp
- 状压DP SCOI2005 互不侵犯King
- 【bzoj 1087】[SCOI2005]互不侵犯King(状压dp)
- BZOJ 1087 SCOI2005 互不侵犯King 状压DP
- 【BZOJ1087】【SCOI2005】【互不侵犯king】【状压dp】
- 【bzoj1087】[SCOI2005]互不侵犯King 状压DP
- bzoj 1087: [SCOI2005]互不侵犯King 状压dp
- 【bzoj 1087】[SCOI2005]互不侵犯King 状压dp
- BZOJ1087: [SCOI2005]互不侵犯King 状压DP
- [BZOJ1087][SCOI2005][状压DP]互不侵犯King
- bzoj 1087 [SCOI2005]互不侵犯King 状压dp
- BZOJ1087: [SCOI2005]互不侵犯King 题解【DP】【状压】
- 如何获得root shell
- Oracle中存储过程问题,求大侠请教下
- 有关Android线程的学习
- listview android:cacheColorHint,android:listSelector属性作用
- [linux]Linux TCP/IP 协议栈源码分析
- SCOI2005——互不侵犯King(状压DP)
- php反射 检查类
- 在线视频流播放控制(优酷、土豆、酷六、音乐台)
- 邓明善:一定要学会与机遇博弈
- Oracle 11gR2 Active Data Guard 安装配置
- 全排列
- Mongoengine提供类型Django Model的体验
- 软件无线电 卫星通信 DSP算法
- 根据两点经纬度,计算其距离