☆ [POJ2411] Mondriaan's Dream 「状压DP」
传送门 >Here<
题意:用1*2的砖块铺满n*m的地板有几种方案
思路分析
状压经典题!
我们以$f[i][j]$作为状态,表示第i行之前全部填完并且第i行状态为j(状压)时的方案数。
我们考虑,对于一个格子,一块砖有3种方法。
(一):横着放。对下一行没有任何影响
(二):竖着放,并且当前这一格作为砖块的下层。那么对下一行也没有任何影响
(三):竖着放,并且当前这一格作为砖块的上层。这种情况对下一行很明显是有影响的。
综上,只有情况3是对下一行有影响的。
所以我们需要一种方法来区分前两种情况和第三种情况。
对于第一种情况,我们把横着的两个位置都染上1,第二种情况的所在格子染成1。唯有第三种情况的时候把当前格子染成0.
所以基本思路就有了,枚举行,然后枚举上下两个状态进行状态转移。如果这两种状态能够吻合(即不冲突),就累计方案数。
那么怎么进行判断是否冲突呢?
首先,一上一下不能再同一个位置出现0——因为这就意味着有两个竖放砖块的上层。
另外,如果一上一下都是1,意味着是两个横放砖块——相邻的两个格子也必须是1.
这样做单独一个的复杂度是4千万左右不会爆,但是考虑到题目有多组询问……打表就好了。
Code
这个代码是表的生成器。
/*By QiXingzhi*/
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
#define int ll
const int N = ;
const int INF = ;
int h,w,lim;
int f[][N];
inline bool Check(int lst, int cur, int m){
for(int i = ; i < m;){
if(!(lst & ( << (i))) && !(cur & ( << (i)))) return ;
else if((lst & ( << (i))) && (cur & ( << (i)))){
if((lst & ( << (i+))) && (cur & ( << (i+)))){ i += ; continue; }
else return ;
}
else{ ++i; continue; }
}
return ;
}
inline int solve(int n, int m){
memset(f, , sizeof(f));
lim = ((<<(m))-);
f[][lim] = ;
for(int i = ; i <= n; ++i)
for(int j = ; j <= lim; ++j)
if(i == ){ if(Check(lim, j, m)) ++f[][j]; }
else{ for(int k = ; k <= lim; ++k) if(Check(k, j, m)) f[i][j] += f[i-][k]; }
return f[n][lim];
}
main(){
while(){
scanf("%d %d", &h, &w);
if(!h && !w) break;
if((h & ) && (w & )){ printf("0\n"); continue; }
printf("%lld\n",solve(h,w));
}
return ;
}
☆ [POJ2411] Mondriaan's Dream 「状压DP」的更多相关文章
- [Poj2411]Mondriaan's Dream(状压dp)(插头dp)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18096 Accepted: 103 ...
- poj2411 Mondriaan's Dream[简单状压dp]
$11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...
- POJ2411 Mondriaan's Dream 【状压dp】
没错,这道题又是我从LZL里的博客里剽过来的,他的题真不错,真香. 题目链接:http://poj.org/problem?id=2411 题目大意:给一个n * m的矩形, 要求用 1 * 2的小方 ...
- poj2411 Mondriaan's Dream【状压DP】
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20822 Accepted: 117 ...
- poj2411 Mondriaan's Dream (状压dp+多米诺骨牌问题)
这道题的解析这个博客写得很好 https://blog.csdn.net/shiwei408/article/details/8821853 大致意思就是我们可以只处理两行之间的关系,然后通过这两个关 ...
- 「状压DP」「暴力搜索」排列perm
「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...
- 「BZOJ 5010」「FJOI 2017」矩阵填数「状压DP」
题意 你有一个\(h\times w\)的棋盘,你需要在每个格子里填\([1, m]\)中的某个整数,且满足\(n\)个矩形限制:矩形的最大值为某定值.求方案数\(\bmod 10^9+7\) \(h ...
- POJ 题目2411 Mondriaan's Dream(状压DP)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13519 Accepted: 787 ...
- POJ 2411 Mondriaan's Dream 【状压Dp】 By cellur925
题目传送门 这道题暑假做的时候太模糊了,以前的那篇题解大家就别看了==.今天再复习状压感觉自己当时在写些什么鸭.... 题目大意:给你一个\(n\)*\(m\)的棋盘和许多\(1*2\)的骨牌,骨牌可 ...
随机推荐
- Mac 小记 — iTerm2、Zsh、Homebrew
前言 写完 "Ubuntu 自动化配置" 这篇文章后,每次连服务器心情指数都上升好几个百分点,于是想着应该将 macOs 的开发环境也梳理梳理,应该会对开发效率有所增益. 1. i ...
- python第七章:常用模块--小白博客
yagmail模块 python标准库中发送电子邮件的模块比较复杂,因此,有许多开原的库提供了更加易用的接口来发送电子邮件,其中yagmail是一个使用比较广泛的开原项目,yagmail底层依然使用了 ...
- Python-collections模块-57
返回顶部 模块的导入和使用 模块的导入应该在程序开始的地方 更多相关内容 http://www.cnblogs.com/Eva-J/articles/7292109.html 常用模块 colle ...
- H5 字体属性补充
04-字体属性补充 abc我是段落 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- JVM的常用的调优策略和垃圾回收算法及Tomcat的常用调优参数
jvm调优主要针对堆内存,堆内存分为:新生区.养老区和永久区 永久区存放的是系统jdk自身的interface和class的元数据,所以唯有新生区和养老区具有优化空间. 新生区:伊甸区和幸存者区.所有 ...
- Maven安装与环境配置(Windows)
1.下载安装包 在Maven官网下载最新版的安装包:http://maven.apache.org/download.cgi 2.解压安装包 3.配置Maven环境变量 配置M2_HOME环境变量,指 ...
- centos yum install oracle java
How to install Java on CentOS 7 | Linuxizehttps://linuxize.com/post/install-java-on-centos-7/ CentOS ...
- 中国科学技术大学统一身份认证系统CAS
CAS | Apereohttps://www.apereo.org/projects/cas 中国科学技术大学统一身份认证系统https://passport.ustc.edu.cn/login?s ...
- Highgo 瀚高数据库的简单搭建以及处理参数等.
1. 获取一个瀚高数据库的安装文件 我这边只获取了 瀚高的 2.0.4 的windows x64 版本的. 来源: 同事从供应商那里获取的. 2. windows上面简单安装 很简单 exe 一路ne ...
- Latex常用软件
Linux texMaker sudo apt-get install texlive-full sudo apt-get install texmaker