题意

给定一个 $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. Referenced file contains errors (http://www.springframework.org/...解决

    今天打开老项目出现如下错误: Referenced file contains errors (http://www.springframework.org/schema/context/spring ...

  2. QT5学习记录(一)

    学习环境:Windows10 + QT5.13 + QT Creater4.9.1(2019-08-10 22:02:30) 1.基本工程创建操作 常规操作创建画面,可选择QDialog.MainWi ...

  3. memcached源码分析三-libevent与命令解析

    转载请注明出处https://www.cnblogs.com/yang-zd/p/11352833.html,谢谢合作! 前面已经分析了memcached中的slabs内存管理及缓存对象如何利用ite ...

  4. Service must be explitict android 5.0问题

    如果target到API 21,有一些注意的事项,以下是目前我发现的两个问题1. Service must be explitict,从Lollipop开始,service必须显性声明,解决方案:ht ...

  5. IDEA 开发插件

    Alibaba Java Code Guidelines 阿里巴巴推出的一款Java代码规约扫描插件,按照<阿里巴巴Java开发手册>规定对代码风格以及质量进行实时检测.约束.强推.ecl ...

  6. C# vb .net实现棕褐色效果特效滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的棕褐色效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一 ...

  7. 防止用户重复提交表单数据,session方式,js方式

    1. 使用session的方式创建Token令牌解决 创建一个生成令牌的工具类,在该类中有返回类的对象,生成token的方法 public class TokenUtil { /* *单例设计模式(保 ...

  8. Java自学-控制流程 结束外部循环

    Java中结束外部循环 Java中如何结束外部for循环? 示例 1 : 结束当前循环 break; 只能结束当前循环 public class HelloWorld { public static ...

  9. Linux 软链接和硬链接简介

    在Linux系统中,将文件分为两个部分:用户数据和元数据. 元数据(inode) 元数据即文件的索引节点(inode),用来记录文件的权限(r.w.x).文件的所有者和属组.文件的大小.文件的状态改变 ...

  10. requests模块 高级应用

    目录 requests模块 高级应用 HttpConnectinPool 问题解决 IP代理 简单使用代理 代理池 cookie的处理 页面中验证码识别 使用 multiprocessing.dumm ...