POJ 1321 棋盘问题 DFS 和 状态压缩DP
2016-09-04 15:32
344 查看
好吧,自己的状态压缩DP不是很会,所以就拿这个来练练手好了。
状态压缩很快呀,只是需要更大的内存开销,不过为了时间,也是值得的,我的代码状态压缩0ms搜索却用了47ms。嗯,这个DP要好好学一下。
原理:第二维下标表示当前的局面,1表示这个格子上是不能摆东西的。
代码:
注意,在写状态转移方程的时候用到了一个num[j]<=k这个实际上是可以省略的,只是会慢一些而已。
DFS水过:
状态压缩很快呀,只是需要更大的内存开销,不过为了时间,也是值得的,我的代码状态压缩0ms搜索却用了47ms。嗯,这个DP要好好学一下。
原理:第二维下标表示当前的局面,1表示这个格子上是不能摆东西的。
代码:
#include<cstdio> #include<cstring> #include<climits> using namespace std; int num[UCHAR_MAX+10],limit,n,k,judge[10],arr[10][UCHAR_MAX+10],calc(int x),ans; char c; int main(){ for(int i=1;i<=UCHAR_MAX;++i) num[i]=calc(i); arr[0][0]=1; while(scanf("%d%d%*c",&n,&k)&&n!=-1){ for(int i=1;i<=n;++i){ for(int j=0;j<n-1;++j){ scanf("%c",&c); if(c=='.') judge[i]|=1<<j; } scanf("%c%*c",&c); if(c=='.') judge[i]|=1<<(n-1); } limit=1<<n; for(int i=1;i<=n;++i){ for(int j=0;j<limit;++j) if(num[j]<=k){ arr[i][j]+=arr[i-1][j]; for(int t=0;t<n;++t){; if((((1<<t)&judge[i])==0)&&(j&(1<<t))==0) arr[i][j|(1<<t)]+=arr[i-1][j]; } } } for(int i=0;i<limit;++i) if(num[i]==k) ans+=arr [i]; printf("%d\n",ans); ans=0;memset(judge,0,sizeof(judge)); for(int i=1;i<=n;++i) memset(arr[i],0,sizeof(int)*limit); } return 0; } int calc(int x){ int times=0; while(x){ if(x&1) ++times; x>>=1; } return times; }
注意,在写状态转移方程的时候用到了一个num[j]<=k这个实际上是可以省略的,只是会慢一些而已。
DFS水过:
#include<cstdio> using namespace std; int ans,board[10][10],n,k; void dfs(int rows,int num); bool flag[10]; int main(){ while(scanf("%d%d%*c",&n,&k)&&n!=-1){ for(int i=0;i<n;++i){ for(int j=0;j<n-1;++j) scanf("%c",&board[i][j]); scanf("%c%*c",&board[i][n-1]); } dfs(0,0); printf("%d\n",ans); ans=0; } return 0; } void dfs(int rows,int num){ if(num==k){ ++ans; return; } if(rows>=n) return; for(int i=0;i<n;++i){ if(board[rows][i]=='#'&&!flag[i]) flag[i]=true,dfs(rows+1,num+1),flag[i]=false; } dfs(rows+1,num); }
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- C 语言实现迷宫 DFS算法
- 深度优先搜索算法
- 一幅图弄清DFT与DTFT,DFS的关系
- HDFS---Namenode
- HDFS ---- Services startup
- POJ1523 SPF dfs
- 329. Longest Increasing Path in a Matrix
- poj1731 Orders dfs
- 【日常练习】Prime Ring Problem(素数环)
- Surrounded Regions
- Binary Tree Zigzag Level Order Traversal,Restore IP Addresses,Word Search,Simplify Path
- DFS基础(1)