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[][];
int num[];
int dp[][]; int main()
{
// freopen("in.txt","r",stdin); for(int i=;i<;i++)
{
int tmp=i;
while(tmp)
{
if(tmp&)
num[i]++;
tmp>>=;
}
} while(~scanf("%d%d",&n,&k) && n!=- && k!=-)
{
char str[];
for(int i=;i<=n;i++)
{
scanf("%s",str+);
for(int l=;l<=n;l++)
{
if(str[l]=='#')
mp[i][l]=true;
else
mp[i][l]=false;
}
} int status=<<n; memset(dp,,sizeof(dp));
dp[][]=;
for(int i=;i<=n;i++)
{
for(int j=;j<status;j++) if(num[j]<=k)
{
dp[i][j]+=dp[i-][j];
for(int l=;l<=n;l++) if(mp[i][l] && (j&(<<(l-)))==)
{
dp[i][(j|(<<(l-)))]+=dp[i-][j];
}
}
} int ans=;
for(int i=;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[][];
bool col[]; void DFS(int x,int rest)
{
if(rest==)
{
count++;
return;
}
if(x>n)
return;
for(int i=;i<=n;i++) if(!col[i] && mp[x][i])
{
col[i]=true;
DFS(x+,rest-);
col[i]=false;
}
if(rest+x<=n)
DFS(x+,rest);
} int main()
{
// freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&k) && n!=- && k!=-)
{
memset(col,,sizeof(col));
char str[];
for(int i=;i<=n;i++)
{
scanf("%s",str+);
for(int k=;k<=n;k++)
{
if(str[k]=='#')
mp[i][k]=true;
else
mp[i][k]=false;
}
} count=;
DFS(,k);
printf("%d\n",count);
}
}
POJ 1321 棋盘问题(DFS & 状压DP)的更多相关文章
- POJ 1321 棋盘问题 --- DFS
POJ 1321 题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子. (注意 .不可放 #可放) 解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标 ...
- poj 3254 Corn Fields (状压dp)(棋盘dp)
状压dp入门题 因为当前行的状态只和上一行有关 所以可以一行一行来做 因为m <= 12所以可以用二进制来表示放了或者没有放 0表示没放,1表示放 f[i][state]表示第i行状态为stat ...
- POJ 2411 Mondriaan's Dream ——状压DP 插头DP
[题目分析] 用1*2的牌铺满n*m的格子. 刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况. So Sad. 然后想到数据范围这么小,爆搜好了.于是把每一种状态对应的转移都搜了出 ...
- poj 2288 Islands and Bridges ——状压DP
题目:http://poj.org/problem?id=2288 状压挺明显的: 一开始写了(记忆化)搜索,但一直T: #include<iostream> #include<cs ...
- POJ 1185 炮兵阵地(状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26426 Accepted: 10185 Descriptio ...
- Calculation(dfs+状压dp)
Problem 1608 - Calculation Time Limit: 500MS Memory Limit: 65536KB Total Submit: 311 Accepted: ...
- POJ 2411 Mondriaan's Dream -- 状压DP
题目:Mondriaan's Dream 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...
- CODEVS1358【DFS/状压DP】
题目链接[http://codevs.cn/problem/1358/] 题意:这个游戏在一个有10*10个格子的棋盘上进行,初始时棋子位于左上角,终点为右下角,棋盘上每个格子内有一个0到9的数字,每 ...
- POJ 1795 DNA Laboratory (贪心+状压DP)
题意:给定 n 个 字符串,让你构造出一个最短,字典序最小的字符串,包括这 n 个字符串. 析:首先使用状压DP,是很容易看出来的,dp[s][i] 表示已经满足 s 集合的字符串以 第 i 个字符串 ...
随机推荐
- (转)web.config 为某个单独页面设置编码格式
原文链接:http://www.cnblogs.com/mytechblog/articles/1937407.html 全站应用utf-8格式,在web.config里的<system.web ...
- NOSQL之【WIN7的安装配置】
1.下载安装 大家根据各自系统配置,下载相对应的redis版本.我下载是redis 2.6 将redis.conf 复制到 bin/release/redisbin 里面 redis-server.e ...
- PHP中进制之间的互相转换
常见的进制: 二进制 binary -----> bin 八进制 octal -----> oct 十进制 decimal -----> dec 十六进 ...
- live 写博
1 2 3 4 5 1 2 3 4 5 ...
- Extension method for type
扩展其实真的很简单 msdn是这样规定扩展方法的:"扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的. 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为 ...
- Interface的多层继承
我有一段如下代码,定义一个接口iInterface,cBase实现iInterface,cChild继承cBase,UML为 预期是想要cBase.F()的执行逻辑,同时需要cChild的返回值,所以 ...
- Mac OSX 安装Python的paramiko模块经验总结
一.简单介绍 最近需要用Python模拟登录远程服务器并自动执行一些代码,需要安装一个叫paramiko的模块. paramiko官方介绍遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接 ...
- poj 1904 King's Quest
King's Quest 题意:有N个王子和N个妹子;(1 <= N <= 2000)第i个王子喜欢Ki个妹子:(详见sample)题给一个完美匹配,即每一个王子和喜欢的一个妹子结婚:问每 ...
- ASP.NET MVC NHibernate 整合
请注明转载地址:http://www.cnblogs.com/arhat 在整合这三个技术之前,首先得说明一下整合的步骤,俗话说汗要一口一口吃,事要一件一件做.同理这个三个技术也是.那么在整合之前,需 ...
- java枚举类型enum的使用
2015-10-24 java达人 Java 中 的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型.要了解枚举类型,建议大家先打开jdk 中的E ...