hdu 1400 Mondriaan's Dream 解题报告
题目链接: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 解题报告的更多相关文章
- HDU - 1400 Mondriaan's Dream
HDU - 1400 思路: 轮廓线dp入门题 #include<bits/stdc++.h> using namespace std; #define fi first #define ...
- POJ 2411.Mondriaan's Dream 解题报告
题意: 给出n*m (1≤n.m≤11)的方格棋盘,用1*2的长方形骨牌不重叠地覆盖这个棋盘,求覆盖满的方案数. Solution: 位运算+状态压缩+dp ...
- [ACM] HDU 1400 Mondriaan's Dream (状态压缩,长2宽1长方形铺满)
Mondriaan's Dream Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 1556.Color the ball 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 题目意思:有 n 个气球从左到右排成一排,编号依次为1,2,3,...,n.给出 n 对 a, ...
- hdu 1160 FatMouse's Speed 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 题目意思:给出一堆老鼠,假设有 n 只(输入n条信息后Ctrl+Z).每只老鼠有对应的weigh ...
- hdu 1879 继续畅通工程 解题报告
题目链接:http://code.hdu.edu.cn/showproblem.php?pid=1879 这条题目我的做法与解决Constructing Roads的解法是相同的. 0 表示没有连通: ...
- hdu 1233 还是畅通工程 解题报告
题目链接:http://code.hdu.edu.cn/showproblem.php?pid=1233 并查集的运用, 实质就是求最小生成树.先对所有的村庄距离从小到大排序,然后判断村庄之间是否属于 ...
- hdu 1213 How Many Tables 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 有关系(直接或间接均可)的人就坐在一张桌子,我们要统计的是最少需要的桌子数. 并查集的入门题,什 ...
- hdu 1272 小希的迷宫 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 第二条并查集,和畅通工程的解法类似.判断小希的迷宫不符合条件,即有回路.我的做法是,在合并两个集 ...
随机推荐
- 【POJ1226】Substrings(后缀数组,二分)
题意: n<=10,len<=100 思路: 只有一个字符串的时候特判一下 #include<cstdio> #include<cstring> #include& ...
- 【Codevs1922】骑士共存问题(最小割,二分图最大独立集转最大匹配)
题意: 在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入. 对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个 ...
- grafana 安装 和 Nginx 、EL 联调
https://blog.csdn.net/u010735147/article/details/80943593
- nyoj_90_整数划分_201403161553
整数划分 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1. 正整数 ...
- python和linux的环境设置/PATH
一.python的环境设置 1.输出path列表: pi@raspberrypi:~$ pythonPython 3.4.0 (default, Jul 1 2014, 09:37:01) [GCC ...
- dropwizard问题记录1:如何进行mvn package打包,如何在项目目录下运行
dropwizard的helloworld入门教程,跟着教程一步步写很容易,但是最后打包时暴露了自己底子太差的缺陷 mvn package操作 之前工作中完全没有接触过这种打包方式,都是直接打war包 ...
- java集合系列之HashMap源码
java集合系列之HashMap源码 HashMap的源码可真不好消化!!! 首先简单介绍一下HashMap集合的特点.HashMap存放键值对,键值对封装在Node(代码如下,比较简单,不再介绍)节 ...
- Ubuntu官方Wiki教程资源
前言:通常学习一样新知识时,最快的方式是通过搜索引擎然后以最快的方式拿枪上战场,如果接下来还一直依赖搜索引擎去打,那么你会发现自己永远都在打游击:那么如果要解决这个问题,必须要学会系统的学习,只有连贯 ...
- 【postgresql】postgresql中的between and以及日期的使用
在postgresql中的between and操作符作用类似于,是包含边界的 a BETWEEN x AND y 等效于 a >= x AND a <= y 在postgresql中比较 ...
- 基于Android的远程视频监控系统(含源码)
基本过程是android作为socket客户端将采集到的每一帧图像数据发送出去,PC作为服务器接收并显示每一帧图像实现远程监控.图片如下(后来PC端加了个拍照功能)... (PS.刚学android和 ...