题意

给定一个 $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. 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用

    一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点: 如果找到了,删除它. 说明: 要求算法时间复杂度为 O(h),h 为树的高度. 示例: root = [5,3,6,2,4,null,7] ...

  2. 函数this指向哪个对象?

    函数的this指向是根据函数调用时所处的执行环境来确定的. this指向对象的情况有四种: 1.使用new关键字时:this会绑定构造函数所创建的对象. function Foo(){ this.a ...

  3. An Illustrated Proof of the CAP Theorem

    An Illustrated Proof of the CAP Theorem The CAP Theorem is a fundamental theorem in distributed syst ...

  4. .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖

    原文:.NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖 我们有多种工具可以将程序集合并成为一个.打包成一个程序集可以避免分发程序的时候带上一堆依赖而出问题. ILMerge 可以用来 ...

  5. drf中的各种view,viewset

    drf中的各种view,viewset Django REST framework里有各种各样的view,让我有点蒙,得好好捋一捋这关系. 视图的作用 Django用"视图"这个概 ...

  6. 无法生成服务引用(添加WebService)

    参考地址:http://www.52study.org/bencandy-120-1076-1.html 问题场景:.在工程中添加WebService,报错: 解决办法:  1.配置该服务引用 将下面 ...

  7. port: ${SERVER_PORT:9190} #首先取环境变量,如果环境变量中没有,就取 9190 这个固定值

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'spring.datas ...

  8. Java之路---Day08

    2019-10-22-22:28:39 目录 1.Static静态类 2.Static内存图 3.Static静态代码块 4.Arrays类 5.Math类 Static静态类 一旦使用static修 ...

  9. Jmeter:内存配置 -- 转发

    在压测过程中jmeter报内存溢出,可能的原因有很多.要注意下面三点: 1.单击压测过程中使用过多的线程,官网建议1000-2000.具体看机器的配置和启动应用的情况.(A single JMeter ...

  10. 【开发工具】- Windows下多个jdk版本切换

    一.直接安装jdk,如图我安装了JDK6.JDK7和JDK8三个版本: 二.在安装JDK8后需要在 C:\Windows\System32 该目录下删除 java.exe 和 javaw.exe两个文 ...