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的解题报告,相信对于初学动态规划和深度优先搜索的同学来说有很好的帮助作用。 立即下载

相关推荐

如何使用ArcGIS自动矢量化建筑

在显示的重分类对话框内,输入栅格选择提取单波段后的栅格,重分类分为三个层级,旧值分别为100-249、250-251和252-255,对应新值为1、2和3,旧值的最小和最大值不用修改,保持和原有的一致。同样在ArcToolbox内点击Spatial Analyst工具点击“重分类\重分类”,在重分类对话框内输入栅格选择之前重分类过后的图片,将旧值3的新值设置为1,这样分类后就只有两类。在显示的新建Shapefile对话框内,名称命名为折线,要素类型选择折线,点击编辑,设置坐标系为WGS 1984。

2165

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

蓝桥杯嵌入式(基础教程)STM32G431RBT6——创建工程以及点灯

首先选择正确的芯片类型:STM32G431RBT6工程的创建主要有配置时钟以及烧录的方式。在配置好之后需要对时钟进行配置,由于蓝桥杯的外部晶振是24MHz因此需要对时钟树进行相应的配置。第一步先点击时钟配置之后就可以对时钟进行相应的配置了最后一步,需要对工程起一个名字,并且要选择KEIL做为其相应的软件之后再需要再生成代码那里进行相应的控制。当然这样根据生成的工程不能直接使用会有一个报错,所以需要添加一个启动文件。这个启动文件可以在官方的LCD文件夹下复制到自己的工程中。

m0_74051113的博客 1093

算法:轮廓线dp

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

Wangpeiyi9979的博客 5602

TCN实战:用Python手把手搭建时序预测模型(附完整代码)

本文详细介绍了如何使用Python搭建TCN(Temporal Convolutional Network)时序预测模型,包括数据预处理、模型架构实现、训练调优及预测评估。通过完整的代码示例和实用技巧,帮助开发者快速掌握TCN在时间序列预测中的应用,特别适合处理长期依赖问题。

weixin_29041195的博客 372

电动车辆的动力总成控制

手把手教你学Simulink——电动车辆的动力总成控制在汽车工程领域,电动汽车(EV)的动力总成控制系统是确保车辆性能、效率和驾驶体验的关键。动力总成控制系统通常包括电机控制、电池管理系统(BMS)、能量回收系统等组件。通过使用Simulink,我们可以模拟和测试这些系统的运行情况,优化设计,并验证控制算法的有效性。

amy_mhd的博客 968

POJ 2411 - 状压DP详解

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

P19777的博客 1392

Pattern Recognition 投稿过程记录,含Elsevier Latex模板使用

Pattern Recognition 投稿过程记录,含Elsevier Latex模板使用 最近在Pattern Recognition投出了一个文章,纯纯属于是第一次投稿,感觉自己写了一坨屎,事实是这确实也是一坨屎,现在是投了之后在等待一个拒稿的状态。 但是还是记录一下一些流程 1. 下载模板 在出版商Elsevier的栏目里有对于稿件的结构要求,也提供了Latex模板。同时,也给作者提供了Guides, 可以仔细阅读。下面这个连接咱们可以下载到Guides以及看到一些文章的要求。 https://ww

weixin_44153180的博客 3万+

轮廓线dp小结

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

a_forever_dream的博客 1290

增量学习入门:概念、代码示例与应用场景

在当今快速变化的数据环境中,传统的机器学习模型往往需要重新训练以适应新的数据。然而,这种方法不仅耗时耗力,还可能导致模型性能的不稳定。增量学习(Incremental Learning)作为一种新兴的学习范式,能够在新数据到来时动态更新模型,而无需重新训练整个模型。本文将详细介绍增量学习的基本概念、代码示例、应用场景以及需要注意的事项。增量学习作为一种高效的机器学习方法,能够在新数据到来时动态更新模型,具有广泛的应用前景。通过本文的介绍,相信你对增量学习有了初步的了解。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1152

Unreal5从入门到精通之一文搞懂Unreal的C++代码编译之谜

我们在开发Unreal项目时,如果时蓝图模板的项目,一般问题不大,因为当你修改完蓝图,点击编译Compile+保存Save,就可以继续开发了。这对于开发者来说也非常友好。但是,如果你使用的C++模板开发项目,代码编译一切都变得魔幻起来,IDE(VS/Rider)里面有编译,编辑器里面也有编译,有什么区别呢?我们来列举几个新手常碰到的问题。1.代码我明明新建了,编辑器里怎么看不到?2.昨天我新家的功能运行的好好的,今天怎么感觉还是老逻辑。或者昨天加的新代码,新蓝图不见了。

TxNet 1606

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

【电源专题】LDO基础——热性能2

对于LDO散热而言,选择合适的元件并不是一件简单的任务。为了实现高效、尺寸得当并成本低的散热解决方案,我们在早期设计阶段就需要确保所有器件都可用并且已经考虑到元件和各种特性。

一点硬件 895

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

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

Lazer2001 736

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

【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、付费专栏及课程。

余额充值