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 个字符串 ...
随机推荐
- 常用Linux/Unix/Mac Os命令
常用Linux/Unix/Mac OS命令 参考: 1.50 Most Frequently Used UNIX / Linux Commands (With Examples)
- 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(三)
jar包完成后,剩下就是要构建ANE包来供实际程序调用. 首先要建两个Flex库项目, default那个是官方建议加上的,仅用于不在真实环境下编译调试的时候有个默认接口不至于调用不成功报错,项目结构 ...
- leetcode problem 42 -- Trapping Rain Water
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- day19 数据库的初步认识
一:数据库的概念 数据库:一个用于储存数据并可以对之进行管理和使用的软件系统. sql:struct(结构) query(查询) language(语言) 结构化查询语言: 其实是一种国际化语言标 ...
- Linux+svn无法显示日志
自己在linux中配置了一个svn服务器,但是客户端在浏览日志的时候报错.提示不能连接到服务器,是否离线查看... 谷歌了一下,是因为svnserve.conf中配置了anon-access = re ...
- QtSQL学习笔记(2)- 连接到数据库
要使用QSqlQuery或者QSqlQueryModel访问一个数据库,首先需要创建并打开一个或多个数据库连接(database connections). 一般地,数据库连接是根据连接名(conne ...
- 简单重置Centos服务器中Mysql的root密码
1.编辑MySQL配置文件my.cnf vi /etc/my.cnf #编辑文件,找到[mysqld],在下面添加一行skip-grant-tables [mysqld] skip-grant-tab ...
- Mac OS X下GnuPlot的安装和配置(无法set term png等图片输出)
今天使用gitstats分析git repo的活动信息,发现其内部使用gnuplot,结果发现无法生成png图片,进入gnuplot的shell发现无法设置png格式输出.如下 gnuplot> ...
- centos 关闭触摸板,触摸板点击
yum install xorg-x11-apps xinput –list 由图可以看出俺的本本触摸板ID为14,于是可以通过以下命令开启与关闭它: 禁止touchpad:xinput set-in ...
- 调试NodeJS应用
OS:Windows 1.下载安装NodeJS 点击http://nodejs.org/界面上“Install”,下载后运行安装,默认安装到到C:\Program Files\nodejs.安装后确认 ...