题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1400

题目意思:给出一个h * w的 大 矩形,需要用 1 * 2 的砖块去填充这个大矩形,问填充的方案数是多少。

这题参考这里的:

  http://www.informatik.uni-ulm.de/acm/Locals/2000/solution/dream.c

把每一列的方格压缩为二进制编码,搜索上一列到当前列的状态转化是否能够成功。对于每一个位置,有3种放置方法:竖直、水平、不放

对每个方格,1表示填充砖块,0表示没有填充砖块。将一层的状态存放在一个二进制数中。

1、利用dfs,计算第一层的填充状态

2、从第 1 层向第 n 层,利用DP 递推结果。

变量from 和 to 的最大值,是宽为W的方格中都填充1,即(1<<W)-1,或者2^W-1

初始时,假设第 0 层都填充1,只有一种情况。

使用数组dp 表示每一层的递推关系,递推公式:

令:from[j] = state[j] [0],       to[j] = state[j] [1],0 ≤ j < nstate

则dp[i+1] [to[j]] =        ∑            dp[i] [from[j]], 0 ≤ j < nstate,  0 ≤ i < H

0 ≤  j < nstate

最近都是抄人代码的节奏= =,哎~~~~,继续努力吧!!!

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; double dp[][]; // 存放各层的递推结果(当宽为11时,2^11-1 = 2047,开2100即可)
int state[][]; // 保存状态转化的结果
int H, W, nstate; // n: 当前从左往右数第n个方格,from:前n个方格在这一层编码, to:下一层的编码
// from 和 to的二进制长度与大长方形的宽度W是一致的
void dfs(int n, int from, int to)
{
if (n > W)
return;
// 整个宽度W填充完毕
if (n == W)
{
// 保存当前的状态转化
state[nstate][] = from;
state[nstate++][] = to;
return;
}
// 放置砖块的3种状态
// 水平放置砖块
dfs(n+, (from<<)+, (to<<)+); // 这个地方的+3, 后面的+1 不知道它想干嘛。希望有能之士可以指点指点
// 竖直放置砖块
dfs(n+, (from<<)+, to<<);
// 不放置
dfs(n+, from<<, (to<<)+);
} void DP()
{
memset(dp, , sizeof(dp));
// 第0层都填充1,只有一种情况
dp[][(<<W)-] = ;
for (int i = ; i < H; i++)
{
for (int j = ; j < nstate; j++)
dp[i+][state[j][]] += dp[i][state[j][]];
}
} int main()
{
while (scanf("%d%d", &H, &W) != EOF && (H+W))
{
if (H < W)
swap(H, W);
nstate = ;
dfs(, , );
DP();
printf("%.0f\n", dp[H][(<<W)-]);
}
}

hdu 1400 Mondriaan's Dream 解题报告的更多相关文章

  1. HDU - 1400 Mondriaan's Dream

    HDU - 1400 思路: 轮廓线dp入门题 #include<bits/stdc++.h> using namespace std; #define fi first #define ...

  2. POJ 2411.Mondriaan's Dream 解题报告

    题意: 给出n*m (1≤n.m≤11)的方格棋盘,用1*2的长方形骨牌不重叠地覆盖这个棋盘,求覆盖满的方案数. Solution:                位运算+状态压缩+dp       ...

  3. [ACM] HDU 1400 Mondriaan&#39;s Dream (状态压缩,长2宽1长方形铺满)

    Mondriaan's Dream Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  4. hdu 1556.Color the ball 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 题目意思:有 n 个气球从左到右排成一排,编号依次为1,2,3,...,n.给出 n 对 a, ...

  5. hdu 1160 FatMouse's Speed 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 题目意思:给出一堆老鼠,假设有 n 只(输入n条信息后Ctrl+Z).每只老鼠有对应的weigh ...

  6. hdu 1879 继续畅通工程 解题报告

    题目链接:http://code.hdu.edu.cn/showproblem.php?pid=1879 这条题目我的做法与解决Constructing Roads的解法是相同的. 0 表示没有连通: ...

  7. hdu 1233 还是畅通工程 解题报告

    题目链接:http://code.hdu.edu.cn/showproblem.php?pid=1233 并查集的运用, 实质就是求最小生成树.先对所有的村庄距离从小到大排序,然后判断村庄之间是否属于 ...

  8. hdu 1213 How Many Tables 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 有关系(直接或间接均可)的人就坐在一张桌子,我们要统计的是最少需要的桌子数. 并查集的入门题,什 ...

  9. hdu 1272 小希的迷宫 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 第二条并查集,和畅通工程的解法类似.判断小希的迷宫不符合条件,即有回路.我的做法是,在合并两个集 ...

随机推荐

  1. 标准C程序设计七---02

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  2. R语言入门---杂记(一)---R的常用函数

    1.nchar():查看字符串长度. 2.rev(): 给你的数据翻个个 3.sort():给你数据排个序(默认从小到大依次排列) 4.runif():产生均匀分布的随机数 #runif

  3. Spring注解处理Ajax请求-JSON格式[系统架构:Spring+SpringMVC+MyBatis+MySql]

    1.前端jsp页面 <div class="tab_tip"> 请输入[身份证号或姓名] <input type="text" class=& ...

  4. eclipse 安卓虚拟机安装apk 及常见问题

    首先必须启动虚拟机然后如图操作:

  5. Spring 定时器 定时访问数据库并发送邮件

    我这里有两个案例的方法: 第一种:使用Spring quartz: 我这里使用的jar:spring-context-support.jar.quartz-1.6.5.jar ============ ...

  6. win10+Linux18.04双系统安装

    给好多可爱的妹子重装了那么多次电脑,懒得码过程,因为我一般每次都要查一查...这次来个综合版吧,超简单,无脑操作. 首先说一下我的电脑Thinkpad + 500G 硬盘 (2014年买的老电脑) 首 ...

  7. 死磕 java同步系列之自己动手写一个锁Lock

    问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...

  8. Codeforces Round #310 (Div. 2)简洁题解

    A:原来是大水题,我还想去优化.. 结果是abs(num('0')-num('1')); num表示一个符号的个数; B:暴力模拟即可,每次判断是否能构造出答案. C:俄罗斯套娃,套套套,捉鸡的E文. ...

  9. Spring Boot集成Spring Data Reids和Spring Session实现Session共享

    首先,需要先集成Redis的支持,参考:http://www.cnblogs.com/EasonJim/p/7805665.html Spring Boot集成Spring Data Redis+Sp ...

  10. $.ajax里一个中文全角逗号引发的惨案

    昨天,在制作一个页面时,突然发生一件不可思议的事情--JS失效了! 确实让人匪夷所思,我记得饭前还是正常运作的. 于是慢慢的缩小范围,把下午刚加的语句删掉,删完了页面就正常了. 于是被删除的这部分代码 ...