POJ 1321 棋盘问题(DFS 状压DP)
用DFS写当然很简单了,8!的复杂度,16MS搞定。
在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀。
状态转移分两种,当前行不加棋子,和加棋子。dp[i][j]中,i代表行数,j代表当前行棋子的状态。j的二进制中,1代表有旗子,0代表无棋子。
贴代码~状压DP果然快一点。
#include <cstdio> #include <cstring>int n,k,count; bool mp[10][10]; int num[256]; int dp[9][256];int main() { // freopen("in.txt","r",stdin);for(int i=1;i<256;i++){int tmp=i;while(tmp){if(tmp&1)num[i]++;tmp>>=1;}}while(~scanf("%d%d",&n,&k) && n!=-1 && k!=-1){char str[20];for(int i=1;i<=n;i++){scanf("%s",str+1);for(int l=1;l<=n;l++){if(str[l]=='#')mp[i][l]=true;elsemp[i][l]=false;}}int status=1<<n;memset(dp,0,sizeof(dp));dp[0][0]=1;for(int i=1;i<=n;i++){for(int j=0;j<status;j++) if(num[j]<=k){dp[i][j]+=dp[i-1][j];for(int l=1;l<=n;l++) if(mp[i][l] && (j&(1<<(l-1)))==0){dp[i][(j|(1<<(l-1)))]+=dp[i-1][j];}}}int ans=0;for(int i=0;i<status;i++) if(num[i]==k)ans+=dp[n][i];printf("%d\n",ans);} }
还有传统的DFS……
#include <cstdio> #include <cstring>int n,k,count; bool mp[10][10]; bool col[10];void DFS(int x,int rest) {if(rest==0){count++;return;}if(x>n)return;for(int i=1;i<=n;i++) if(!col[i] && mp[x][i]){col[i]=true;DFS(x+1,rest-1);col[i]=false;}if(rest+x<=n)DFS(x+1,rest); }int main() { // freopen("in.txt","r",stdin);while(~scanf("%d%d",&n,&k) && n!=-1 && k!=-1){memset(col,0,sizeof(col));char str[20];for(int i=1;i<=n;i++){scanf("%s",str+1);for(int k=1;k<=n;k++){if(str[k]=='#')mp[i][k]=true;elsemp[i][k]=false;}}count=0;DFS(1,k);printf("%d\n",count);} }
转载于:https://www.cnblogs.com/IT-BOY/p/3231266.html
POJ 1321 棋盘问题(DFS 状压DP)相关推荐
- 【vijos P1914】【codevs 3904】[NOIP2014 普及组T4]子矩阵(dfs+状压dp)
P1914子矩阵 Accepted 标签:NOIP普及组2014[显示标签] 描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与 列的相对顺序)被称为原矩阵 ...
- POJ 1185 炮兵阵地 【状压DP】
<题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
- POJ - 2411 Mondriaan's Dream(状压dp)
题目链接:点击查看 题目大意:铺瓷砖 题目分析:经典之经典的状态压缩动态规划,具体的懒得说了,怠惰ing..一个月之前写的代码,还好当时注释做的好,现在稍微一看就能立马理解,码到博客上存着吧,三种方法 ...
- POJ 1185 炮兵阵地(状压DP)题解
思路:和上一篇思路一样,但是这里要求最大能排几个,这里要开三维,记录上次和上上次的状态,再一一判定,状态转移方程为 dp[i][j][k] = max(dp[i][j][k],dp[i - 1][k] ...
- POJ 1185 炮兵阵地(状压dp)
http://poj.org/problem?id=1185 题意: 思路: 每一行最多只有10列,所以可以用二进制来表示每一行的状态. d[i][j][k]表示第i行状态为k时,并且上一行状态为j时 ...
- 第九届河南省赛 宣传墙 //状压dp+矩阵快速幂+dfs
http://nyoj.top/problem/1273 状压dp+矩阵快速幂+dfs 1273-宣传墙 内存限制:64MB 时间限制:1000ms 特判: No 通过数:19 提交数:64 难度:4 ...
- 【状压DP】【cofun1375】麦田
[cofun1375]麦田 Description 话说公元199年,曹操准备与袁绍进行官渡决战.为整肃军纪,曹操下令:"全军将士,上至统帅,下至马佚,行军训练,不准践踏庄稼,不准倒犯民利, ...
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
最新文章
- java http head 请求_http请求头header、请求体body、请求行介绍
- 深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析
- NeurIPS 2019 | 17篇论文,详解图的机器学习趋势
- 记一次Hbase数据迁移和遇到的问题
- solr cloud 更新 solrconfig 配置_Solr各版本新特性「4.x,5.x,6.x,7.x」
- concat效率 mysql_MySQL统计函数GROUP_CONCAT使用陷阱分析
- 顶岗实习周记java方向_前途虽远,扶摇可接 | 商务日语专业顶岗实习动员大会...
- 常用零部件表面粗糙度标注及表面处理技术
- 三阶魔方还原简单七步公式
- 本地Remix与私链节点相连
- 基于 Verilog 的经典数字电路设计(14)移位寄存器
- 计算机的端口以及tcp/ip中的端口
- radmi4a Android,红米4A(Redmi 4A 全网通)一键ROOT教程,看教程ROOT
- 斐讯k3搭建nginx+php+MariaDB(mysql )的教程
- 生活随记-安心照顾母亲
- python 微信机器人 关键词_python-微信机器人之词云
- [转]Windows Mobile 常用键值(VK)对应表及系统文件夹简单介绍
- Tensorflow,pytorch,Caffe,MXNet,PaddlePaddle,THeano算法框架哪家强?
- iphone已停用解锁大概多少钱_iPhone已停用怎么办 iPhone已停用解决方案汇总
- 哑铃锻炼身体各个部位的方法