POJ2411 - Mondriaan's Dream (状压DP+轮廓线DP)

POJ 2411 Mondriaan's Dream (轮廓线DP代码详解) Mondriaan’s Dream(POJ 2411) Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18772 Accepted: 10717 Description Squares and rectangles fascinated the famous Dutch painter Piet... 阅读详情

题目链接:

http://poj.org/problem?id=2411


题目大意:

这题题意非常明确,现在有一个 M × N 的矩形,你现在有很多个 2 × 1 大小的方块,现在要用这些方块铺满这个矩形,请问有多少种铺法。


解题过程:

这题不是遇到卡住的,是学新知识的模板题,然后顺着书的思路做的,理解还是花了一番功夫。先看的挑战那本书,后来又翻了下大白书,还是 LRJ 的书写的详细易读,最后终于看懂了。

刚开始理解错状态了,书上专门说了下多段图路径问题,然后我顺便把状态理解成每一行的对应 2 ^ M 个状态了,然后状态转移的时候怎么想都不对,最后又看了下复杂度,才发现是 O ( N × M × 2 ^ M ),然后看了下完整代码,发现每一行的每一列都是一个阶段,每个阶段对应 2 ^ M 个状态,然后一个新状态由上一个阶段的状态转移而来。


题目分析:

首先确定状态。

假设我是从左上角开始依次从左至右从上至下的放方块,那么可以得出结论:假设现在要放的点为 (i, j),大小按照字典序(先按行,后按列)。 那么对于所有的点 (i’, j’) >= (i, j) 一定是还没有放。对于所有 (i’, j’) < (i-1, j) 的点一定是已经放了方块的。

这里写图片描述

假设我要放置 (4, 4) 这个点,那么绿色的地方都是已经铺满的,蓝色的地方都是未铺的,黄色的地方是未确定的。接下来只要状态压缩表示黄色的部分好了。用 1 表示已铺,0 表示未铺。

这里写图片描述

然后放置一个位置 (i, j)的时候有三种方式,分别是不放,向上竖着放,向左横着放。如果是不放,那么 (i-1, j) 位置一定是已经铺了的,否则不可能转移到一个合法的状态。如果是向上竖着放,那么 (i-1, j) 一定要是未铺的。如果向左横着放,那么 (i, j-1) 一定是未铺的。

这里写图片描述

此外大白书上介绍了多段图的概念。有 n 列节点,每列称一个阶段,每个阶段的节点只会先下一个阶段的节点连有向边。本题就可以转化为从多段图的一个节点到达另一个节点的路径个数,矩形里的每一个方块都是一个阶段。而且递推的时候要求一个阶段只需要用到他的上一个阶段,所以可以用滚动数组实现。

AC代码:

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

typedef long long ll;

const int MAX = 15;
int n, m, cur;
ll dp[2][1<<MAX];

int main() {
    while (~scanf("%d %d", &n, &m) && (n+m)) {
        if (n < m) swap(n, m);
        memset(dp, 0, sizeof(dp));
        cur = 0;
        //初始化状态,看做第一行的上一行已经全部铺满
        dp[cur][(1<<m)-1] = 1;

        //枚举每一行每一列
        for (int i = 0; i < n; i ++) {
            for (int j = 0; j < m; j++) {
                //滚动数组
                cur ^= 1;
                memset(dp[cur], 0, sizeof(dp[cur]));
                for (int k = 0; k < (1<<m); k++) {
                    ll num = dp[cur^1][k];
                    //判断要放的位置的上面一块是否已铺
                    if (k&(1<<(m-1))) {
                        //不放
                        dp[cur][(k<<1)^(1<<m)] += num;
                        //判断要放的位置的左边一块是否未铺
                        if (j && !(k&1)) {
                            //向左横着放
                            dp[cur][((k<<1)^(1<<m))+3] += num;
                        }
                    }
                    else if (i) {
                        //向上竖着放
                        dp[cur][(k<<1)+1] += num;
                    }
                }
            }
        }
        printf("%lld\n", dp[cur][(1<<m)-1]);
    }
}
POJ 2411 Mondriaan's Dream详细解题报告 里面有非常详细的对于POJ 2411的解题报告,相信对于初学动态规划和深度优先搜索的同学来说有很好的帮助作用。 立即下载

相关推荐

LK32T102 单片机 操作GPIO实现流水灯(1)

前言: LK32T10232(32位)单片机是一款专为电机控制器和数字电源开发的高性能 MCU。采Cortex-M0 内核,最高工作频率可达 72Mhz,ADC 采样速率 达 1Msps。同时具备协处理器单元可满足各种乘法、除法、移位以及各种 复杂函数运算。 LK32T102(32位)支持单电源供电,且内嵌高精度高速及低速振荡器,以及具备 多种低功耗工作模式。同时,集成了多路增强型 PWM,多通道模拟比较 器和高速运算放大器,可满足多种电机及功率控制应用,并简化系统成本。...

qq_58676187的博客 3189

POJ2411Mondriaan's Dream题解动态规划DP

Mondriaan's DreamTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 4978 Accepted: 2873DescriptionSquares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series' (where he had

魔神翼 1157

STM32驱动GP2Y1010AU0F红外PM2.5传感器:从采样时序到浓度标定

在嵌入式环境监测项目中,模拟传感器输出信号的准确采集是系统可靠性的基石。许多工程师在接触红外散射式粉尘传感器时,常因不了解其特殊的脉冲驱动与采样保持机制,导致ADC读数异常。红外散射原理通过检测颗粒物散射光强来估算粉尘浓度,其输出信号并非稳定直流,而是与LED脉冲同步的短时窗口电压。理解这一时序特征,并掌握在STM32平台上通过定时器与ADC协同完成微秒级精准采样的方法,是获取有效数据的关键。该技术广泛应用于室内空气质量检测、空气净化器控制及DIY环境监测节点等场景。本文以GP2Y1010AU0F为例,详细

weixin_29159127的博客 283

算法:轮廓线dp

文章目录什么是轮廓线DP例题一:铺砖问题(Poj 2411) 什么是轮廓线DP 适用范围: 较窄的棋盘(m×nm \times nm×n中mmm或者nnn较小)。按整行或者整列无法进行转态转移。而把轮廓线作为状态一部分。具体见例题。 例题一:铺砖问题(Poj 2411) 我们在状压DP中已经介绍过一种整行状态转移的方法,但是这里我们采用轮廓线的方法解决。对每个小格,我们定义0为非覆盖,1为覆盖...

Wangpeiyi9979的博客 5602

昆仑通态,自由串口通讯

软件默认无该功能,需要问客服索要扩展包。

cfqq1989的博客 1537

从生产订单到整车交付,SAP 离散制造在汽车行业里的真实落点

汽车行业谈数字化,很容易一上来就谈智能工厂、数字孪生、AI 排产、无人仓、视觉质检。可落到 SAP 项目现场,真正把工厂撑起来的,往往还是几个很朴素的问题,客户订单来了以后,BOM 能不能准确展开,物料能不能准时到线,产能有没有被过度承诺,生产订单能不能被车间正确执行,质量问题能不能追溯,成本能不能按工单和批次沉淀下来。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 113

POJ 2411 - 状压DP详解

poj:http://poj.org/problem?id=2411 这个题属于状态压缩的一个入门题,在讲解该题之间我们先简单的回顾一下状压DP。 注意再看这个题之前,一定要对动态规划有一定的掌握 状压DP: 与传统的DP一样,状压DP也是定义状态,通过前一阶段的状态,推出当前阶段的状态。但是有时候状态特别多,但是每个状态的决策又非常少,我们如果用多维数组来表示状态会造成空间浪费,也可能会...

P19777的博客 1392

【数据集】1980-2020年(5年)土地利用分类数据-中国科学院

简介1980-2020年每五年土地利用数据-中国科学院

WW、forever的博客 3932

轮廓线dp小结

介绍 本质上是状压dp,所以是用在一类数据范围很小的题中,一般是求方案数之类的。 正题 这个东西大家有时候也管他叫插头dp,个人认为插头dp只是轮廓线dp的一种,只是把轮廓线上的状态设计成插头而已,事实上也可以不是插头,确实也有这样的题。 不过插头dp可能更广为人知,这里就以一道经典题作为例题: 给出一张网格图,每个位置是.或*,*表示这个位置不可用,你要在可用的位置上设计一条哈密顿回路,经过所有可用点。链接 不知道这道题的话还是看一眼原题比较好qwq。 先说轮廓线是什么东西,说清楚也很简单,就是下面的

a_forever_dream的博客 1290

手把手教你学simulink实例--基于Simulink的轨道交通车辆悬挂系统仿真

轨道交通车辆悬挂系统是保证列车运行平稳性、舒适性和安全性的重要组成部分。通过悬挂系统的合理设计,可以有效减小车辆在运行过程中受到的轨道不平顺和振动影响。基于MATLAB/Simulink平台进行悬挂系统仿真,可以对悬挂系统的动力学行为、控制策略以及性能优化等环节进行建模与分析,从而验证系统的设计性能并优化参数。本项目旨在构建一个完整的轨道交通车辆悬挂系统仿真模型,包括悬挂系统动力学建模、控制策略模块以及性能评估模块,并通过仿真验证系统的稳定性和舒适性。

MHD0815的博客 1032

六种光耦综合对比——《器件手册--光耦》

可控硅输出光耦(SCR Optocoupler)是一种特殊的光电耦合器,由红外发光二极管(LED)和双向可控硅(SCR)组成,用于实现输入和输出之间的电气隔离和信号传输。逻辑输出光耦是一种高效、可靠的数字信号隔离和电平转换器件,通过电气隔离和逻辑电平输出,确保了系统的安全性和信号的稳定性。固态继电器(可控硅输出,SSR)是一种无触点电子开关设备,利用可控硅(SCR或Triac)作为主要开关元件,通过光耦合器实现输入和输出之间的电气隔离。光耦作为一种成熟的电气隔离器件,在电子电路设计中具有重要的地位。

XU157303764的博客 1726

Mondriaan's Dream POJ - 2411(轮廓线dp 状压dp)

Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his ‘toilet series’ (where he had to use his toilet paper to draw on, for all of h...

tomjobs的博客 1710

YOLOv8-Pose 姿态识别 RK3588 实战:从模型训练到 RKNN 部署,精度与推理速度双提升

本教程从YOLOv8-pose模型的姿态识别训练,到RK3588的边缘量化部署,为你打造了一套“高精度+高实时性+低成本”的人体姿态分析解决方案。无论是健身动作纠正、智能安防行为检测,还是工业人员姿态监控,这套技术都能直接复用——你只需替换数据集与业务逻辑,即可快速落地专属的边缘AI姿态识别系统。如果你在实践中遇到任何卡点,欢迎随时交流。记住,人体姿态识别的价值在于“关键点准、推理快、部署易”,而这三者的平衡,正是你通过本教程能掌握的核心能力。

FJN110的博客 364

T解 POJ-2411 Mondriaan's Dream [轮廓线DP] || [状压DP]

大家都很强,可与之共勉。今天考试遇到了一道神题,用俄罗斯方块铺地板地板上还有柱子(数据范围十分感人)。std是要用轮廓线DP。在此之前没有听说过轮廓线DP,故开始学习。当然看到这一道入门级的题。最初做的时候是用的状压DP(其实是正解+打表)。轮廓线DP显然是按点DP,分析该点之前的状态,若合法,则从该状态更新。初始化即为f[0][(1 << m) - 1] = 1(希望大家自己想清楚为什么这么做,我

Lazer2001 736

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Mondriaan's Dream POJ - 2411 (状压dp,轮廓线dp)

DescriptionSquares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his ‘toilet series’ (where he had to use his toilet paper to draw on, fo

退役的铜牌狗 495

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

poj2411 Mondriaan's Dream (轮廓线dp、状压dp)

Mondriaan's Dream Time Limit:3000MS Memory Limit:65536K Total Submissions:17203 Accepted:9918 Description Squares and rectangles fascinated the famous Dutch pa...

weixin_30780221的博客 211

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【poj 2411】Mondriaan's Dream 状压dp(轮廓线性dp)

好吧,终于可以来填这一道题的坑了,说来我和这一道题也是有些渊源了吧,因为是一道非常经典的轮廓线性dp所以后人的改进算法也是非常之多,导致出现了一大批位运算技巧满天飞的看不懂,每次又静不下来写,所以耽搁了很久了。 参考代码:http://www.cnblogs.com/keam37/p/3834490.html?utm_source=tuicool 其实还是比较喜欢这种用dfs写的,代码

pbihao的博客 350

poj 2411 Mondriaan's Dream 轮廓线dp

题目链接: http://poj.org/problem?id=2411 题目意思: 给一个n*m的矩形区域,将1*2和2*1的小矩形填满方格,问一共有多少种填法。 解题思路: 用轮廓线可以过。 对每一个格子,枚举上一个格子的状态,得到当前格子的所有状态值。 dp[cur][s]表示当前格子的轮廓线状态为s的情况下的总数 代码: #include #include #incl

cc_again的专栏 2681

POJ 2411 Mondriaan's Dream // 状压dp

POJ 2411 Mondriaan's Dream // 状压dp http://poj.org/problem?id=2411 突然觉得这题有丶意思,拿来写写看。(是个典型例题,用2*1砖头铺满矩形的方案数) 将一列压缩成一个二进制,就是一个状态,总共2^w*h个状态,直接dp+dfs。时间复杂度O(2^w*h)。 转移的时候,已知前一行满,将当前列填满,这样转移就行了。 ...

Rshs 315

[POJ] 2411 Mondriaan's Dream [轮廓线dp]

Mondriaan’s Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17605 Accepted: 10105 DescriptionSquares and rectangles fascinated the famous Dutch painter Piet Mondriaan. O

chutzpah 535

Mondriaan's Dream 【POJ - 2411】

题目链接 题目大意 有一个n * m的格子,铺满1 * 2的地砖有多少种方式 解题思路 是个状压dp的板子题 一个是穷举的状压dp,一个是轮廓线dp 存一下这两个博客讲的还是很详细的 状压版 轮廓线版 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; lon...

qq_41925919的博客 206

POJ2411-Mondriaan's Dream(轮廓线DP)

题目链接 题意 用2*1的骨牌填充满m*n的矩阵,问有多少种不同的填法。 思路 有、没有用1、0表示,状压DP的思想,但是区别是用的是2*1的骨牌,填一行后可能会有不填的情况,所以轮廓线DP(或插头DP)就是解决这种每次一行不是整个的问题。记录的状态,不是一整行的状态,而可能是一个斜着的状态,状态的第一个位置并不一定对应着每行的第一个位置。 轮廓线DP详解:https://blog.cs...

QAQ 272

【轮廓线DP】POJ2411-Mondriaan's Dream

今天美国的院士过来讲课XD以为会很无聊但是谜之好听,而且英语基本上都听懂了的样子♪(´▽`) 逃到图书馆来写解题报告 【题目大意】 给出一个m*n的方格,用2*1的骨牌覆盖有几种情况。 【思路】 最基础的轮廓线DP。分为三种情况: (1)向上放,必须要满足上面的格子没有被放,且当前不在首行。→新状态=旧状态删去首位,末尾为1; (2)向左放,必须要满足左边的格子和上面的格子...

dianchunhui2654的博客 144

poj2411 Mondriaan's Dream[简单状压dp]

$11*11$格子板上铺$1*2$地砖方案。以前做过?权当复习算了,毕竟以前学都是浅尝辄止的。。常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续偶数个的1,预处理一下即可。注意数据及时reset。 1 #include<iostream> 2 #include<cstdio> 3 #inc...

dianer2977的博客 114

轮廓线DP 专项

原题: POJ 2411 题意: nm(n,m&amp;amp;amp;amp;amp;lt;=11)的矩阵,填12或2*1方块,求方案数 解析: 以前写过状压的做法,直接一行一行维护,现在写轮廓线的做法 注意: 当前填红点的意思是,以红点作为方块的右下角 因为方块长度为2,所以对红点位置有三种操作 向上填:为了使所有方块填满,如果A方块没有被填,则必须向上填(红+A) 向左填:当上面已经填好时,而左边没有填时,可以向左填(红+B...

QAQ 1226
上一篇: POJ3169 - Layout (差分约束)
下一篇: HDUOJ3549 - Flow Problem(网络流+最大流最小割+模板)
ACM_Fish
博客等级 码龄10年 69粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值