SGU 131.Hardwood floor
时间限制:0.25s
空间限制:4M
题意:
给出 n*m (1≤n、m≤9)的方格棋盘,用 1*2 的矩形的骨牌和 L 形的(2*2 的
去掉一个角)骨牌不重叠地覆盖,求覆盖满的方案数。
Solution:
还是状态压缩,这次的情况比较多,要全部列出。
b1,b2分别代表上下两行前列对下一列的影响
s1,s2对应上下两行的状态
情况 |
上列b1,b2要求 |
状态改变 | 对下一列的影响 |
10 10 |
b1=0, b2=0; |
s1<<1, s2<<1|1; |
b1=0, b2=0; |
11 10 |
b1=0, b2=0; |
s1<<1, s2<<1|1; |
b1=1, b2=0; |
10 11 |
b1=0, b2=0; |
s1<<1, s2<<1|1; |
b1=0, b2=1; |
00 11 |
b2=0; |
s1<<1|1-b1, s2<<1|1; |
b1=0, b2=1; |
01 11 |
b2=0; |
s1<<1|1-b1, s2<<1|1; |
b1=1, b2=1; |
11 01 |
b1=0; |
s1<<1, s2<<1|b2; |
b1=1, b2=1; |
00 00 |
无 |
s1<<1|1-b1, s2<<1|b2; |
b1=0, b2=0; |
参考代码:
- #include <iostream>
- #include <cstdio>
- #define LL long long
- using namespace std;
- int n, m, x;
- LL f[12][1 << 12];
- //b1,b2,分别标记上一列队下一列的影响
- void dfs (int k, int last, int now, int b1, int b2) {
- if (k == m){
- if(!b1&&!b2)
- f[x][now] += f[x - 1][last];
- return;
- }
- if (!b1 && !b2) {
- dfs (k + 1, last << 1 , now << 1 | 1, 0, 0);
- dfs (k + 1, last << 1 , now << 1 | 1, 1, 0);
- dfs (k + 1, last << 1 , now << 1 | 1, 0, 1);
- }
- if (!b1)
- dfs (k + 1, last << 1 , now << 1 | b2, 1, 1);
- if (!b2) {
- dfs (k + 1, last << 1 | (1-b1), now << 1 | 1, 0, 1);
- dfs (k + 1, last << 1 | (1-b1), now << 1 | 1, 1, 1);
- }
- dfs (k + 1, last << 1 | (1-b1), now << 1 | b2, 0, 0);
- }
- int main() {
- scanf ("%d %d", &n, &m);
- if (n < m) swap (n, m);
- f[0][ (1 << m) - 1] = 1;
- for ( x = 1; x <= n; x++)
- dfs (0, 0, 0, 0, 0);
- printf ("%lld", f[n][ (1 << m) - 1]);
- }
SGU 131.Hardwood floor的更多相关文章
- SGU 131. Hardwood floor 状压dp 难度:2
131. Hardwood floor time limit per test: 0.25 sec. memory limit per test: 4096 KB The banquet hall o ...
- Hardwood floor - SGU 131(状态压缩)
题目大意:用 2*1 或者2*2-1的格子覆盖M*N的矩阵,有多少种覆盖方式. 分析:容易知道有以下6种放置方式. 然后用深搜的方法直接搞出来就行了,不过要使用两个变量来判断本位是否受影响.如果本行的 ...
- sgu 131 状压DP
棋盘覆盖(二) 时间限制:1000 ms | 内存限制:65535 KB 描述 The banquet hall of Computer Scientists' Palace has a ...
- SGU131 - Hardwood floor(状态压缩DP)
题目大意 给定一个N*M大小的矩形,要求你用1*2和2*2(缺个角)的砖块把矩形铺满(不能重叠),问总共有多少种铺法? 题解 受POJ2411的影响,怎么都没想到3,4,5,6这几种情况该怎么放置,看 ...
- SGU 分类
http://acm.sgu.ru/problemset.php?contest=0&volume=1 101 Domino 欧拉路 102 Coprime 枚举/数学方法 103 Traff ...
- 今日SGU 5.15
最近事情好多,数据库作业,没天要学2个小时java,所以更新的sgu就比较少了 SGU 131 题意:给你两种小块一种,1*1,一种2*2-1*1,问你填满一个m*n的矩形有多少钟方法,n和m小于等于 ...
- 今日SGU 5.14
//SGU 131 还没完全想清楚 留坑 SGU 259 题意:一个机器处理n个任务,每个任务有时间t和传送时间l 收获:贪心 #include<bits/stdc++.h> #defin ...
- 别人整理的DP大全(转)
动态规划 动态规划 容易: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ...
- dp题目列表
此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...
随机推荐
- 【转】VC++ MFC 常用技巧(一)
原文网址:http://www.lewensky.cn/read.php/106.htm (-). 下面是常见的Afx全局函数: AfxFormatString1:类似printf一般地将字符串格式化 ...
- Linux学习笔记4——函数调用栈空间的分配与释放
一.函数执行时使用栈空间作为自己的临时栈,3种方式决定编译器清空栈的方式:__stdcall. __fastcall.__cdecl 1.__stdcall表示每个调用者负责清空自己调用的函数的临时栈 ...
- java基础(七)面向对象(二)
这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...
- Java同步
同步:★★★★★ 好处:解决了线程安全问题. 弊端:相对降低性能,因为判断锁需要消耗资源,产生了死锁. 定义同步是有前提的: 1,必须要有两个或者两个以上的线程,才需要同步. 2,多个线程必须保证使用 ...
- JavaScript高级程序设计14.pdf
继承,ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的 构造函数.原型.和实例的关系:每个构造函数都有一个原型对象,每个原型对象都包含一个指向构造函数的指针,每个实例都包含一 ...
- HashMap和Hashtable
HashTable 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的 速 ...
- MHz 和 Mbps的区别
Hz是频率单位,例如10Hz就是表示每秒运算10次 Mbps是Million bit per secend (表示每秒传输的兆位数)=Mb/s MHz 和 Mbps 并不是同一个单位,关键是看bus的 ...
- Service的两种启动方法
刚才看到一个ppt,介绍service的两种启动方法以及两者之间的区别. startService 和 bindService startService被形容为我行我素,而bindService被形容 ...
- Ubuntu 安装vim出错
在Ubuntu 12.10中安装vim时出现了如下提示: www.linuxidc.com @linuxidc:/etc/apt$ sudo apt-get install vim正在读取软件包列表. ...
- 【长篇高能】ReactiveCocoa 和 MVVM 入门
翻译自ReactiveCocoa and MVVM, an Introduction. 文中引用的 Gist 可能无法显示.为了和谐社会, 请科学上网. MVC 任何一个正经开发过一阵子软件的人都熟悉 ...