题意

给定一个 $n \times m$ 的格子,每个格子被染成了黑色或白色。现在要用 $1 \times 2$ 的砖块覆盖这些格子,要求块与块之间互不重叠,且覆盖了所有白色的格子,但不覆盖任意黑色格子。求一共有多少种覆盖方法。结果对 $M$ 取余。($1 \leq n\leq 15, 1 \leq m\leq 15$)

分析

爆搜,从最左上方开始放置,从左至右,从上到下,每找到一种方案返回1.

#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int mod = ; int n, m;
const int maxn = +;
bool color[maxn][maxn]; //false为白,true为黑
bool used[maxn][maxn]; int rec(int i, int j)
{
if(j == m) return rec(i+, ); //进入下一行
if(i == n) return ; //已经覆盖所有空格
if(used[i][j] || color[i][j]) return rec(i, j+); //不需要在(i, j) 上放置砖块 //尝试2种放法
int res = ;
used[i][j] = true; //横着放
if(j+ < m && !used[i][j+] &&!color[i][j+])
{
used[i][j+] = true;
res += rec(i, j);
used[i][j+] = false;
}
//竖着放
if(i+ < n && !used[i+][j] && !color[i+][j])
{
used[i+][j] = true;
res += rec(i, j+);
used[i+][j] = false;
} used[i][j] = false;
return res % mod;
} int main()
{
//init color
scanf("%d%d", &n, &m);
printf("%d,", rec(, ));
}
}

这个方法的时间复杂度为 $O($nm\cdot 2^{nm})$,会超时。也无法使用记忆化搜索。

但是仔细思考会发现,实际参数并没有这个多种可能。

不确定的只有每一列里还没有查询的格子种的最上面的一个,共 $m$ 个。从而可以把这 $m$ 个格子通过状态压缩编码进行记忆化搜索,复杂度为 $O(nm\cdot 2^{m})$.

#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int mod = ; int n, m;
const int maxn = +;
const int M = ;
bool color[maxn][maxn]; //false为白,true为黑 int dp[][ << maxn]; void solve()
{
int* crt = dp[], *nxt = dp[];
crt[] = ;
for(int i = n-;i >= ;i--)
for(int j = m-;j >= ;j--)
{
for(int used = ; used < ( << m); used++)
{
if((used >> j & ) || color[i][j])
nxt[used] = crt[used & ~( << j)]; //不需要在(i, j)放置砖块
else
{
//尝试2种放法
int res = ;
if(j+ < m && !((used >> (j+)) & ) && !color[i][j+]) //横着放
res += crt[used | ( << (j+))];
if(i+ < n && !color[i+][j])
res += crt[used | ( << j)]; //竖着放
nxt[used] = res % M;
}
}
swap(crt, nxt);
}
printf("%d\n", crt[]);
} int main()
{
//init color
scanf("%d%d", &n, &m);
solve();
}

From:《挑战程序设计竞赛》

铺砖头问题(完美)——爆搜&&插头DP的更多相关文章

  1. BZOJ 1207: [HNOI2004]打鼹鼠【妥妥的n^2爆搜,dp】

    1207: [HNOI2004]打鼹鼠 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3259  Solved: 1564[Submit][Statu ...

  2. 【BZOJ-1853&2393】幸运数字&Cirno的完美算数教室 容斥原理 + 爆搜 + 剪枝

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 1817  Solved: 665[Submit][Status] ...

  3. 51nod 1989 竞赛表格 (爆搜+DP算方案)

    题意 自己看 分析 其实统计出现次数与出现在矩阵的那个位置无关.所以我们定义f(i)f(i)f(i)表示iii的出现次数.那么就有转移方程式f(i)=1+∑j+rev(j)=if(j)f(i)=1+\ ...

  4. POJ 2411 Mondriaan's Dream ——状压DP 插头DP

    [题目分析] 用1*2的牌铺满n*m的格子. 刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况. So Sad. 然后想到数据范围这么小,爆搜好了.于是把每一种状态对应的转移都搜了出 ...

  5. 插头DP(基于连通性状态压缩的动态规划问题)(让你从入门到绝望)

    今天,我,Monkey king 又为大家带来大(ju)佬(ruo)的算法啦!--插头DP 例题(菜OJ上的网址:http://caioj.cn/problem.php?id=1489): 那么,这道 ...

  6. uoj#422. 【集训队作业2018】小Z的礼物(MIn-Max容斥+插头dp)

    题面 传送门 题解 好迷-- 很明显它让我们求的是\(Max(S)\),我们用\(Min-Max\)容斥,因为\(Min(S)\)是很好求的,只要用方案数除以总方案数算出概率,再求出倒数就是期望了 然 ...

  7. 插头DP专题

    建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议 ...

  8. bzoj 2331: [SCOI2011]地板 插头DP

    2331: [SCOI2011]地板 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 541  Solved: 239[Submit][Status] D ...

  9. [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样 ...

随机推荐

  1. 在CAD中插入谷歌地球卫星地图

    本文主要介绍如何在CAD中插入谷歌地球卫星地图,作为参照光栅图像.谷歌地球卫星地图使用“迈高图-地图数据下载器”(以下简称:迈高图)下载.迈高图会给出相关插入参数(插入点和缩放比例),保证插入卫星地图 ...

  2. 基于Keras搭建MLP

    Keras是一套基于Tensorflow.Theano及CNTK后端的高层神经网络API,可以非常友好地支持快速实验,本文从零开始介绍了如何使用Keras搭建MLP并给出两个示例. 基于Ubuntu安 ...

  3. 2. 运行Spark Streaming

    2.1 IDEA编写程序 Pom.xml加入以下依赖: <dependency> <groupId>org.apache.spark</groupId> <a ...

  4. java注解注意点

    注意:以后工作中代码中 不允许出现警告 自定义注解 1:自定义注解并没有发挥它的作用,而Eclipse自带的注解通过反射另外有一套代码,可以发挥它的作用,例如:跟踪代码...... 2:如果自定义的代 ...

  5. C#——零散学习

    C#——零散学习0 //控制台输入字符串,转化为int,double,float等数值类型: //Convert.ToXXX32();函数. Convert.ToInt32(); //把字符串转换为i ...

  6. 学习笔记—log4net

    一.log4net.dll下载地址:http://logging.apache.org/log4net/download_log4net.cgi 二.在项目中引用log4net.dll 三.设置在程序 ...

  7. 爬虫多次爬取时候cookie的存储用于登入

    一.用requests模块自动保存(保存缓存中) 构建一个session对象session = requests.session() 用构建的session代替requests进行访问他就会自动存啦 ...

  8. 2019 房多多java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.房多多等公司offer,岗位是Java后端开发,因为发展原因最终选择去了房多多,入职一年时间了,也成为了面试官 ...

  9. That IP address can't be assigned to.的问题

    That IP address can't be assigned to. 烦恼了很久,现在知道了,解决的办法如下 首先确定端口号是不是开放,阿里云的直接在控制台修改 其次 看看 你的地址是不是输入错 ...

  10. 用StatSVN统计svn项目中每人代码提交量

    用StatSVN统计SVN服务器项目的代码量 下载并安装SVN统计工具StatSVN 1)下载地址:sourceforge.net/projects/statsvn/ 2)解压压缩包,到一个目录,如D ...