POJ2411: Mondriaan's Dream(1*2铺地砖,DP)

POJ 2411 铺地砖 状态压缩dp入门 Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 10402   Accepted: 6035 Description Squares and rectangles fascinated the famous Dutch painter 阅读详情
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 his paper was filled with squares and rectangles), he dreamt of filling a large rectangle with small rectangles of width 2 and height 1 in varying ways. 

Expert as he was in this material, he saw at a glance that he'll need a computer to calculate the number of ways to fill the large rectangle whose dimensions were integer values, as well. Help him, so that his dream won't turn into a nightmare!

Input

The input contains several test cases. Each test case is made up of two integer numbers: the height h and the width w of the large rectangle. Input is terminated by h=w=0. Otherwise, 1<=h,w<=11.

Output

For each test case, output the number of different ways the given rectangle can be filled with small rectangles of size 2 times 1. Assume the given large rectangle is oriented, i.e. count symmetrical tilings multiple times.

Sample Input

1 2
1 3
1 4
2 2
2 3
2 4
2 11
4 11
0 0

Sample Output

1
0
1
2
3
5
144
51205
 
用2进制的01表示不放还是放
<p>第i行只和i-1行有关</p><p><pre name="code" class="cpp">#include<iostream>
#include<algorithm>
#include<string>
#include<map>
#include<vector>
#include<cmath>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#define ll long long
using namespace std;
ll dp[15][1<<11]; //表示第i行为某种状态的时候(为止)已经有多少种方法数
ll n,m,tem; //n行m列,tem表示方法数
void dfs(int i,int p,int k){ //i:第几行,p:用二进制表示的当前这一行各个位置状态,k:第几列
	if(k>=m){
		dp[i][p]+=tem;
		return;}
	dfs(i,p,k+1);
	if(k<=m-2&&!(p&1<<k)&&!(p&1<<k+1)) //如果该行连续两列都为0,则可以选择添加一个横砖
		dfs(i,p|1<<k|1<<k+1,k+2);} //p|1<<k|1<<k+1表示把该行这两个位置置1
int main(){	
	while(cin>>n>>m&&n!=0&&m!=0){
		memset(dp,0,sizeof(dp));
		tem=1;
		dfs(1,0,0);
		for(int i=2;i<=n;++i){
			for(int j=0;j<(1<<m);++j){
				if(dp[i-1][j]>0){
					tem=dp[i-1][j];
					dfs(i,~j&((1<<m)-1),0);}}} //~j&((1<<m)-1)所有位置取反
		cout<<dp[n][(1<<m)-1]<<endl;} //输出最后一行所有位置的数都是1的情况
	return 0;
}




        
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... 阅读详情

相关推荐

分治算法设计与应用1 L型组件填图问题 棋盘问题 递归 算法

L型组件填图问题 1.问题描述 设B是一个n×n棋盘,n=2k,(k=1,2,3,…)。用分治法设计一个算法,使得:用若干个L型条块可以覆盖住B的除一个特殊方格外的所有方格。其中,一个L型条块可以覆盖3个方格。且任意两个L型条块不能重叠覆盖棋盘。 例如:如果n=2,则存在4个方格,其中,除一个方格外,其余3个方格可被一L型条块覆盖;当n=4时,则存在16个方格,其中,除一个方格外,其余15个方格被5个L型条块覆盖。 2. 具体要求 输入一个正整数n,表示棋盘的大小是n*n的。输出一个被L型条块覆盖的n*n棋盘。该棋盘除一个方格外,其余各方格都被L型条块覆盖住。为区别出各个方格是被哪个L型条块所覆盖,每个L型条块用不同的数字或颜色、标记表示。 3. 测试数据(仅作为参考) 输入:8 输出:A 2 3 3 7 7 8 8 2 2 1 3 7 6 6 8 4 1 1 5 9 9 6 10 4 4 5 5 0 9 10 10 12 12 13 0 0 17 18 18 12 11 13 13 17 17 16 18 14 11 11 15 19 16 16 20 14 14 15 15 19 19 20 20 4. 设计与实现的提示 对2k×2k的棋盘可以划分成若干块,每块棋盘是原棋盘的子棋盘或者可以转化成原棋盘的子棋盘。 注意:特殊方格的位置是任意的。而且,L型条块是可以旋转放置的。 为了区分出棋盘上的方格被不同的L型条块所覆盖,每个L型条块可以用不同的数字、颜色等来标记区分。 5. 扩展内容 可以采用可视化界面来表示各L型条块,显示其覆盖棋盘的情况。 经典的递归问题, 这是我的大代码, 只是本人很懒, 不想再优化

上海计算机学会2021年3月月赛C++乙组T3再铺地砖

存在两种规格的地砖,一种是 1×1 规格的,也就是恰好可以覆盖一个方格,另一种是 1×2 规格的。2.边界为i-2:有三种情况,一是两块1x2横放,二是一块1x2,两块1x1,1x2放上边,三同二,1x2放下边,即a[i-2]*3;a[i]=2*(a[i-1]+a[i-2]+....a[1]+1)+a[i-2],把前边的2*()变成前缀和,即可。1.边界为i-1:有两种方案,一是单块1x2,二是两块1x1.即a[i-1]*2。可以得出2*(1+a[1]+a[2]+a[3]....a[i-3])种方案。

长春高老师编程 1120

单片机按键识别篇---单击---双击----长按

  最近做一任务需要使用一个按键实现三种功能,分别是按键单击功能,按键双击功能和按键长按功能,可能之前没有接触过这类按键复用情况,顶多也只是简单识别单击和长按,没有想过双击以上按键功能,也是绞尽脑汁,想了半天,又上网看了些例程,算是对于按键的识别有点小小的了解,感觉这个功能挺实用,在此做个随笔。 一、思路   1.识别长按操作思路:我们使用系统定时器定时,然后让系统每过一段时间去扫描按键I/O...

weixin_30311605的博客 3660

铺瓷砖--状压dp

最近学了状压dp,把之前未解决的题目捋一捋。 这是之前的一道题 今天蒜头君装修新家,给家里买了一种 1×2或2×1 的长方形(如图1)新瓷砖。蒜头君是个懂得审美的人,毕竟人生除了金钱,还有诗和远方。 这个时候蒜头君就在想,这种长方形的瓷砖铺到一个 10×10 10 \times 10 10×10 的地面上有多少种方案?(如图2:是 4×44 \times 44×4 地面的一种方案) 图1:...

Bowen的博客 1821

深入解析FOC电流环PI参数整定:从理论到实践

本文深入解析了FOC(磁场定向控制)中电流环PI参数整定的核心原理与实践方法。文章从永磁同步电机模型出发,详细阐述了基于带宽与零极点对消的工程法及考虑逆变器延迟的二阶系统整定法两种经典策略,并提供了从理论计算到安全上电调试的完整步骤与常见问题解决方案,帮助工程师精准调校电机控制性能。

weixin_29164497的博客 449

目前最新NIST随机数测试软件下载、安装、及使用教程

最近由于科研需要,在搞一些随机数的测试的事情,众所周知 随机数测试我们可以使用NIST的软件进行多大15项的随机测试,我也在网上查找了很多大牛的博客,但是都是年代久远,很多的链接现在都是物是人非,都是不能直接使用了,今天顺便抽点时间更新一下这个NIST软件的下载及使用。我们首先讲一下该软件的下载:1.我们直接取NIST的官网(https://csrc.nist.gov/)下载即可 ;链接如下:下载...

Miracle.Zhao的博客 3万+

POJ2411 状态压缩DP

POJ2411 Mondriaan's Dream 给你n*m(1矩阵,要求用1*2的多米诺骨牌去填充,问有多少种填充方法。 分析: 首先我们定义如下这种填充表示方式:如果一个骨牌是横着放的,那么它所在的两个方格都填充1.如果它是竖着放的,那么它所在的两个格子中,上面的那个填0,下面的这个填1.如下图所示:   由此可以得到断言:该矩阵的骨牌摆放方法和该矩阵的二进制表示法是一一对应的。

code 1万+

QT上位机开发(掌握一点c++基础)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 c++是c语言的补充和扩展,本身的语法构成也是在一直迭代中。相信很多同学上大学读书的时候,或多或少对c语言有所了解,对它的变量、指针、函数也应该不陌生。既然大家都有c语言基础的话,那么在这方面稍微拓展一下的话,就可以学会c++了。当然c++本身的内容很多,很多方面还很琐碎,但我们学习的时候还是应该把精力放在那些经常使用到的语法上面。

嵌入式-老费,一个分享专业嵌入式知识的blog 1131

铺砖 动态规划 DP

解题思路:首先我们定义dp[i]为i列时候铺砖的方法数,我们考虑2 * 2的时候,一共有3个方法,考虑3 * 2的时候,多出了一列,如果我们竖着直接放一个,方法数就和2 * 2时候一样,即3,也就是dp[i-1]个方法数,如果我们对3的后两列进行铺砖,我们只能横着放两个和竖着放一大个,为什么不能竖着放2个呢,因为这时候的方法数其实就和前面重叠了,所以只能加上2 * dp[i-2]。 所以得出:...

一粒大榴莲的博客 1433

CCP消息格式

CCP消息格式 CCP协议的实现只依赖于两则CAN消息CRO(Command Receive Object)和DTO(Data Transmission Object),CCP消息统一采用8字节数据场,所有命令参数以及数据都被打包在8字节的数据场中。 1、CRO(命令接收对象) CRO是主设备向从设备发送的消息对象,包括命令代码及命令参数,结构如下: CCP一共28条命令,所以命令代码有28个。...

wsq119的博客 1206

运动想象 (MI) 分类学习系列 (19) : EEG-TransNet

本文提出了一种基于注意力机制的卷积神经网络(EEG-TransNet),用于运动想象脑电图(MI-EEG)解码。该方法创新性地通过平均池化和方差池化提取多模态时间信息,并结合自注意力模块捕获长期依赖关系。消融实验表明,方差池化比最大池化更有效(p<0.05),且注意力模块和卷积编码器对特征判别性至关重要。可视化分析验证了该方法能学习到更具判别性的紧凑特征。该工作为MI-EEG解码提供了新的多尺度时间信息融合视角,代码已开源。

走在深度学习前沿的小宋 358

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

ComfyUI报错ModuleNotFoundError: No module named ‘comfy.options‘

好家伙,我一想我刚刚好像用了pip安装了comfy模块,不会是和ComfyUI自带的comfy模块产生冲突了吧。(3)还有的说是项目不是最新版,叫更新到最新版本的,好家伙,我报错之前根本没更新也没错,突然就报错的。(4)还有的说没有comfy.options这部分代码,叫自己去拉一个,我一看也有啊。我也不知道啥时候脑抽风去装这么个东西的,幸好我聪明机智,一眼就知道了。看把我气的,然后网上搜集各种资料,一个一个去试。

满目星辰 5158

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

实现真正的「人机」对战:引入三方 AI 引擎

引入三方 AI 引擎 前边,我们实现了与云库对战的象棋游戏。这一节中,我们将开始实现真正的「人机」对战 — 人与手机 AI 之间对弈; 实现一套象棋 AI 工程浩大,这个工作我们后续文章会做一番介绍。现代软件工程并不主张每个人都「造轮子」,因此我们要有「站在巨人肩膀上」的小智慧。 本节概要 从 github 寻找开源中象引擎 梳理引擎接入的思路 寻找适合的开源中国象棋引擎 github 上有大...

tosmart的博客 983

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

poj2411 Mondriaan's Dream 插头dp做法

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 11379   Accepted: 6610 Description Squares and rectangles fascinated the famous Dutch pai

smz436487的专栏 556

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

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

【状压DP】POJ 2411 Mondriaan's Dream

POJ 2411 Mondriaan's Dream 题意:给一个n*m大的区域,问用1*2的矩形块填充,能够刚好填满的填充方式有多少? FEELING:真的吹爆神犇!!www,这个方法也太巧妙了叭qaq!!!! 大神思路蒟蒻理解: dp[i][s]: 第 i 行状态为s的种类数(保证前i - 1行是全部覆盖的) 我们用01表示(i , j)格子有没有被覆盖,那么每一行都会有一个01串...

L_X_ 208

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

POJ 2411 Mondriaan's Dream 解题报告

POJ 2411 Mondriaan's Dream 解题报告2 与1不同的是,没用dfs,纯dp 思路是: 用0表示没放,1表示放了。横放则左右两格都是1,竖放则上格是0,下格是1。 这种记录state的方法决定了:如果上下两行的state是确定的,那么放法唯一。 Fun(state,n)表示n这行的状态是state的时候有多少种放法。 那么我们要求的就是Fun(2^m...

deng530557273的博客 284

[POJ2411] Mondriaan's Dream 状压dp

[POJ2411] Mondriaan’s Dream 状压dp原题:POJ2411**题意:**N*M的矩阵,用1*2的砖铺,要求不能超出边界并且铺满所有格子,问有多少种铺法?(1<=N,M<=11)(1 <= N, M <= 11)。题解: 砖铺问题。 用dfs写法写无脑的一匹。。。 从左上处理格子,当处理到(i,j)(i, j)格子时,所需要的只有该行和上一行格子的状态(是否有砖),使用

chbug的博客 463

[poj P2411] Mondriaan's Dream

[poj P2411] Mondriaan's Dream Time Limit:3000MS Memory Limit:65536K Total Submissions:18023 Accepted:10327 Description Squares and rectangles fascinated the fa...

a8233821的博客 187

[poj 2411] Mondriaan's Dream{状态压缩DP}

题目 http://poj.org/problem?id=2411 解题思路 代码 #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;algorithm&gt; using namespace std; int n,m; long long f[12][1&lt;&lt;11]; bool s[1&lt;&lt;11]; ...

Nowed 435

Mondriaan's Dream POJ - 2411 (状压DP)

题目链接: Mondriaan's Dream POJ - 2411 题目大意:就是给你一个n*m的矩阵,然后问你用2*1的矩阵和1*2的矩阵,有多少种方法能凑出来n*m的矩阵,在不会有重叠的前提下。 具体思路:状压dp,对于1*2的矩阵,我们将这个方块构成的两块都标记为1;对于2*1的矩阵,我们将上面那个方块标记为0,下面那个方块标记为1.然后在具体判断的过程中,先判断第一...

diaomeijiao3430的博客 141

【poj2411】Mondriaan's Dream 状态压缩dp

AC传送门:http://vjudge.net/problem/POJ-2411 【题目大意】 有一个W行H列的广场,需要用1*2小砖铺盖,小砖之间互相不能重叠,问有多少种不同的铺法? 【题解】 对于每一行有w个位置,所以每一行都有0~2w-1种状态。 对于当前行的状态s,它是由前一行的状态s’转化过来的,显然,对于该行某个位置j: 如果前一行该位置为0,那么该位置可...

anzhi7214的博客 146

POJ2411——Mondriaan's Dream

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12042   Accepted: 7011 Description Squares and rectangles fascinated the famous Dutch painter

Alex 770

poj2411 Mondriaan's Dream 状压DP

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

weixin_30895603的博客 122

POJ 2411 Mondriaan's Dream【状压DP】

题意:给你一个n*m的矩阵,让你用1*2的矩形覆盖全部,问你方案数。 思路:我们可以发现,每个小矩形有两种放置方式,横着放和竖着放,我们设dp[i][s]表示第i行状态为s时的方案数。 当当前位为1表示当前位置是竖着放置的矩形的上半部分,0则表示其他情况。那么对于当前行某个状态s,我们从上一行的某个合法状态p转移过来,那么什么状态算是合法的呢? 1. s & p == 0 这样保...

独钓门前月 324
上一篇: 【codechef】Devu and his Class(巧妙的 模拟,分类讨论)
下一篇: zoj 3865 Superbot (广搜)
ccyy-
博客等级 码龄12年 31粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值