铺瓷砖 状压dp经典问题

蓝桥杯-试题 算法训练 瓷砖铺放-c++递归 瓷砖铺放 题目 资源限制时间限制:1.0s 内存限制:512.0MB 问题描述   有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限。要将这个长度为N的地板铺满,一共有多少种不同的铺法? 例如,长度为4的地面一共有如下5种铺法:   4=1+1+1+1   4=2+1+1   4=1+2+1   4=1+1+2   4=2+2    ... 阅读详情

题意

给出 n×m的矩形方块,可以往上面铺1×2的砖块,问铺满这个方块的方案有多少种。

题解

砖块可以竖铺和横铺,竖铺的话会影响到下一行,横铺的话不会影响到下一行,这里我们令 1:表示该方块不会影响下一行,0:表示该方块会影响下一行。

条件一:
考虑(i.j)这一格,如果(i-1,j)上是0,那说明(i-1,j)是竖铺的砖块,那么(i,j)便是1,该点不会影响到下一行了。若(i-1,j)是1,那么(i,j)可以是0也可以是1。从而可以得知(i,j) | (i-1,j) = 1。

条件二:
只有这个条件还是不够的,因为一旦(i-1,j)是横铺的话,那么(i-1,j+1)也是1,现在考虑初始状态,001100,因为第一行是不会有上一行影响他的,所以如果该点时1那么其必定是横铺。根据横铺的性质,必定有两个连续的1,所以我们可以得出第一行合法的状态有哪些。例如010101便是不合法的。

得出了第一行合法的状态后,枚举第二行的状态,首先要满足的便是条件一,其次考虑条件二,因为第二行是会受上一行影响的,所以如果第二行出现(i,j)出现1那不一定是横铺的砖块,因为如果上一行是(i-1,j)是0的话,那么(i,j)已经被覆盖了且不会影响下一行。

仔细观察的话可以发现。如果(i-1,j)是1同时(i,j)也是1的话那么该处一定是横铺。所以只需两行状态相与(&)为1的点便是横铺,然后便可以判断是否合法(这里有个优化的地方,便是可以预处理出合法的状态有哪些)。

最终一行的答案必须全是1,因为其没有下一行可以影响了。

代码

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
int n,m,mark[1<<11];
int dp[105][1<<11];
void init() {
    for(int i = 0; i < (1<<m); ++i) {
        int k = i;
        bool flag = true;
        while(k) {
            if(k&1) {
                k >>= 1;
                if(!(k&1)) {
                    flag = false;
                    break;
                } 
            }
            k >>= 1;
        }
        if(flag) 
			dp[1][i] = mark[i] = 1;
    }
}
int main() {
    scanf("%d%d", &n, &m);
    if(n < m) swap(n,m);
    init();
    int tot = (1<<m);
    for(int i = 2; i <= n; ++i) {
        for(int j = 0; j < tot; ++j) {
           	for(int k = 0; k < tot; ++k) {
                if((j|k) != tot-1) continue;
                if(!mark[j&k]) continue;
                dp[i][j] = (dp[i][j]+dp[i-1][k])%mod;
            }
        }
    }
    cout << dp[n][tot-1] << endl;
    return 0;
}
Leetcode 1240:铺瓷砖(超详细的解法!!!) 你是一位施工队的工长,根据设计师的要求准备为一套设计风格独特的房子进行室内装修。 房子的客厅大小为 n x m,为保持极简的风格,需要使用尽可能少的 正方形 瓷砖来铺盖地面。 假设正方形瓷砖的规格不限,边长都是整数。 请你帮设计师计算一下,最少需要用到多少块方形瓷砖? 示例 1: 输入:n = 2, m = 3 输出:3 解释:3 块地砖就可以铺满卧室。 2 块 1x1 地... 阅读详情

相关推荐

蓝桥杯经典铺瓷砖问题:状态压缩DP解法详解

状态压缩动态规划(状压DP)是解决棋盘覆盖、摆放等组合优化问题的核心算法思想。其原理在于将每一行的覆盖情况编码为一个二进制整数,从而将高维状态空间压缩为有限的状态集合,并通过预处理枚举合法状态转移,将指数级复杂度降为多项式级。该技术在算法竞赛和工程优化中价值显著,尤其适用于解决如铺瓷砖、多米诺骨牌覆盖等具有后效性的网格填充问题。本文以蓝桥杯经典试题“2xN铺瓷砖”为具体应用场景,深入剖析如何运用DFS进行状态转移预处理,并实现高效的C++解决方案,帮助读者掌握**深度优先搜索**与**动态规划**结合解决复

weixin_33462927的博客 339

试题 算法提高 瓷砖铺放 增强

试题 算法提高 瓷砖铺放 增强 资源限制 时间限制:3.0s 内存限制:256.0MB 问题描述   给了一nxm的方格,用1x3的瓷砖铺满,请问有多少种铺法。瓷砖可以旋转。 输入格式   输入的第一行包含两个整数,n, m。 输出格式   输出一个整数,表示总的铺法数。这个数可能很大,请输出对65521取余的结果。 样例输入 3 3 样例输出 2 数据规模和约定   对于100%的数据,1<=n<=10^15,1<=m<=9。 #include<bits/stdc++.h

qq_46022580的博客 1666

题解-铺瓷砖

题解-铺瓷砖DescriptionInputOutputa解析讲解状压DP运算符题目分析代码部分 Description 今天小信装修新家,给家里买了一种 1×2的长方形(如图1)新瓷砖。小信是个懂得审美的人,毕竟人生除了金钱,还有诗和远方。这个时候小信就在想,这种长方形的瓷砖铺到一个 n×m 的地面上有多少种方案(如图2:是 4×4 地面的一种方案)? Input 输入两个整数 n,m,(1≤M...

Ampty36的博客 1365

东方博宜1367 - 骨牌铺方格

有 1×n(n≤50)的一个长方形,用 1×1、1×2 和 1×3 的骨牌铺满方格,请问有多少种铺法?例如当 n=3 时为 1×3 的方格。此时用 1×1 、1×2 和 1×3 的骨牌铺满方格,共有四种铺法。

kuaidihezi的博客 1937

铺瓷砖问题 (状态压缩动态规划) (一)

题目地址:http://poj.org/problem?id=2411 问题简单描述: 在一个N行M列的格子里,我们现有1*2大小的瓷砖,可以横着或者竖着铺。问一共有多少种方案,可以将整个N*M的空间都填满。 示例: N=2 ,M=4 一共5种方案 N = 2,M = 3; 一共3种方案 问题分析: 1. 因为每块瓷砖的面积是2,所以总面积M*N必须是偶数才能铺满。如果是......

Phill King的专栏 9096

铺瓷砖—C++

Description 今天小信装修新家,给家里买了一种 1×2的长方形新瓷砖。小信是个懂得审美的人,毕竟人生除了金钱,还有诗和远方。 这个时候小信就在想,这种长方形的瓷砖铺到一个 n×m 的地面上有多少种方案 Input 输入两个整数 n,m (1≤MIN(n,m)≤10, 1≤MAX(n,m)≤100)。 Output 输出方案总数(最后结果模 10^9 + 7)。 Sample Input ...

fajin152的博客 7963

动态规划:铺砖问题

问题描述:给定n*m的格子,每个格子被染成了黑色或者白色。现在要用1*2的砖块覆盖这些格子,要求块与块之间互相不重叠,且覆盖了所有白色的格子,但不覆盖任意一个黑色格子。求一共有多少种覆盖方法,输出方案数对M取余后的结果。 限制条件: 1 &lt;= n &lt;= 15 1 &lt;= m &lt;= 15 2 &lt;= M &lt;= 10^9 样例输入: n = 3 m = 3 ...

帅比王的博客 5468

全志平台Sensor驱动移植实战:从点亮到调优的完整指南

本文详细介绍了在全志平台上进行Sensor驱动移植的全过程,从硬件引脚配置到软件参数调优,涵盖点亮、出图和调优三大阶段。重点解析了OV02B10传感器的I2C通信建立、上电时序调试和初始化参数配置等关键技术点,并提供了实用的调试技巧与问题排查指南,帮助开发者高效完成全志平台Sensor驱动移植工作。

weixin_28727975的博客 218

专题·状态压缩[【including Hamilton,铺瓷砖,玉米田

初见安~:)这里是理解了好久终于扯岑头了的一个因状压DP而融会贯通的一个知识点—— 状态压缩 先大概介绍一下吧——所谓状态压缩,即原本我们用一个二维数组,现在拥有一个一维的来表示,其中的每一行用一个int类型的二进制数来表示。这是压缩。 用二进制数表示,不仅节省空间而且比较节省时间——二进制的话就类似于一个对电脑底部原始数据的操作,与之对应的位运算操作(详见位运算基础)亦是如此,直接操作。而...

樱狸✨愿携清风归来处 835

【脚本篇】---spyglass lint脚本

【代码】【脚本篇】---spyglass lint脚本。

冬瓜 6355

GIS坐标系转换以及空间校正和地理配准

许多小伙伴都对坐标系,投影这类问题迷迷糊糊,我之前也一样,现在总结一下。 坐标系的转换1.为什么要进行坐标系的转换?2. 不同坐标系的介绍1.地理坐标系我国常见的地理坐标(1).北京54坐标系(2).西安80坐标系(3).WGS-84坐标系(4).大地2000坐标系2.投影坐标系我国常用的投影坐标系(1) UTM投影(2) 高斯-克吕格投影(3) 兰伯特投影(4) 阿尔伯斯投影投影坐标系的选择3. 坐标系的转换1.已知坐标系之间的转换1.1 两坐标系的参考椭球相同1.2 两坐标系的参考椭球不一致,但是GIS

m0_47258611的博客 8912

铺瓷砖--状压dp

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

Bowen的博客 1821

杰理JL701N V142的SDK实现双备份自定义OTA教程和代码分享

摘要 本文档详细介绍了基于JL701N SDK的UART OTA升级功能开发方案。该方案采用双备份(Dual Bank)机制,通过串口实现安全可靠的固件远程更新。核心特性包括:1) 双备份升级机制确保升级失败可回滚;2) CRC-16/XMODEM校验保障数据完整性;3) 灵活的传输控制,支持自定义波特率和数据包大小。文档提供了完整的系统架构、API接口说明、通信协议规范以及移植指南,适用于生产烧录、现场升级等多种场景。配套Python升级工具简化了升级流程,使开发人员能够快速实现固件更新功能。

qq_42014563的博客 275

铺瓷砖

铺瓷砖 Description 今天小信装修新家,给家里买了一种 1×2的长方形(如图1)新瓷砖。小信是个懂得审美的人,毕竟人生除了金钱,还有诗和远方。这个时候小信就在想,这种长方形的瓷砖铺到一个 n×m 的地面上有多少种方案(如图2:是 4×4 地面的一种方案)? Input 输入两个整数 n,m,(1≤MIN(n,m)≤10, 1≤MAX(n,m)≤100)。 Output 输出方案总数(最...

Konnyaku 1493

Silvaco TCAD 半导体器件仿真全攻略:从入门到精通

本文介绍了Silvaco TCAD半导体器件仿真平台的核心功能与应用方法。主要内容包括: Silvaco TCAD的核心模块组成(ATHENA工艺仿真和ATLAS器件仿真)及其在半导体研发中的重要作用,能够通过数值仿真预测器件电学特性,显著降低研发成本。 环境配置要点,包括内存分配、文件目录管理和许可证验证,为仿真工作提供基础保障。 仿真核心概念:详细讲解了网格划分策略和物理模型选择原则,强调基于物理直觉的自适应加密网格方法。 以PN结二极管为例,提供了完整的仿真代码示例,涵盖从网格定义、掺杂设置到结果分析

huanghm88的专栏 198

EXCEL VBA从入门到精通 第一章:VBA入门

在VBA中,需要使用关键字Dim来定义一个变量,后面跟上变量名和变量的数据类型。例如,下面的代码定义了一个整型变量x和一个字符串变量name在VBA中,使用关键字Const来定义常量,后面跟上常量名和常量的值。例如,下面的代码定义了一个整型常量MAX_NUM和一个字符串常量MESSAGE需要注意的是,常量一旦被定义,其值就不能被改变。

1万+

我是一名铺砖匠——铺砖问题汇总(DP)

鉴于多次遇到铺砖问题,因此目前遇到对此类问题进行总结: 铺砖问题主要分类: 1.简单的一维铺砖问题 2.二维铺砖问题 2*1的砖是否可以铺满N*M的地面 3.二维铺砖铺满有多少种方法 a.2*1的砖铺满2*M的地面有多少种方法? b. 2*1的砖铺满N*M的地面有多少种方法? 『...

Miserable_ccf的博客 9683

CADENCE 25.1打开元件库ERRORCannot perform the operation because of an exception.

摘要:解决CADENCE25.1打开元件库报错"ERRORCannotperformtheoperationbecauseofanexception"的方法:该错误通常由软件中文设置导致。解决方案为:进入Options→Preferences→MorePreferences,取消勾选两个本地语言选项后重启软件即可恢复正常。此方法简单有效,能快速解决因语言设置导致的元件库访问异常问题。(98字)

0 1011

蓝桥国赛训练营:铺瓷砖(状压dp)

题面:给出一种 1x2的瓷砖和n * m的地板,问铺满整个地板有几种方案?答案对 1e9+7求余。 1 <= min(n,m) <= 10 , 1 <= max(n,m) <= 100; 二维状压dp 思维过程: 首先想到一行怎么铺,可以用1表示竖着,0表示横着。有了表示的方法,根据状压dp,我们可以把一行的状态压缩成一维,令dp[i][j] 表示 第i行,铺的方案为...

qq_41997978的博客 721

R语言生存分析之竞争风险模型

R语言生存分析之竞争风险模型 竞争风险模型(Competing Risk Model)是一种处理多种潜在结局生存数据的分析方法,早在1999年Fine和Gray就提出了部分分布的半参数比例风险模型,通常使用的终点指标是累积发生率函数(cumulative incidence function,CIF)。 研究中结局事件可能有多个,某些结局将阻止感兴趣事件的出现或影响其发生的概率,各结局事件形成“竞争”关系,互为竞争风险事件。 竞争风险模型( Competing Risk Model ) : 指

data+scenario+science+insight 5247

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[状压dp][铺瓷砖] Mondriaan's Dream

Mondriaan's Dream 原题链接 Description 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 to...

cp0328的博客 3614

廖雪峰Python教程[完整版]

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

瓷砖铺放 (状压DP+矩阵快速幂)

由于方块最多涉及3行,于是考虑将每两行状压起来,dfs搜索每种状态之间的转移。 这样一共有2^12种状态,显然进行矩阵快速幂优化时会超时,便考虑减少状态。 进行两遍bfs,分别为初始状态可以到达的状态,和可以到达终止状态的状态。 同时出现在两次bfs中的状态即为有效状态,一共有141种。 这样就可以跑出来了。 未加矩阵快速幂 50分 1 const dx:arra...

aekijekzn484879763的博客 254

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

lwip-2.0.3

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

铺砖问题(状压dp)

感受: 一直把《挑战程序设计竞赛》奉为神作,写的真是太好了,超级给力。可是去年看了一周的状压dp,只是对旅行商问题有一点感觉,铺砖问题更是一脑袋浆糊,学的太吃力了,无奈放弃了。今年突然心血来潮,又学了一波,无奈还是卡卡卡到铺砖问题,原来书上的解法是没见过的轮廓线动态规划解法,真是被搞得不要不要的,好气!!! 博客:在此表示深深的感谢~ 状态压缩动态规划 POJ 2411 (编程之美-瓷砖覆盖地...

ó 1951

EOJ 3297. 铺瓷砖【斐波拉契数列的变式+记忆化搜索/DP】⭐⭐⭐⭐⭐

文章目录题目描述知识点实现码前思考代码实现码后反思 题目描述 铺瓷砖 单点时限: 2.0 sec 内存限制: 256 MB 章鱼王的行宫要铺瓷砖了。  行宫中有一长度为 的地板,给定三种不同瓷砖:一种长度为1,一种长度为2,另一种长度为3,数目不限。 要将这个长度为 的地板铺满,并且要求任意两个相邻的瓷砖长度均不等,一共有多少种不同的铺法?在所有的铺设方法中,一共用了长度为1的瓷砖多少块?   例如,长度为4的地面一共有如下3种铺法,并且,一共用了长度为1的瓷砖4块:   4=1+2+1 .

yc_cy1999的博客 520

2016-8-5夏令营总结(状压DP)

今天我们在夏令营主要学习了状压DP的知识。 状压DP是指把DP状态从多维压缩到少维,通常使用二进制的01表示是否操作。

周正华的博客 416
上一篇: CSL的训练计划(拓扑排序)
下一篇: 上下界网络流 (更新中)
Link_Ray
博客等级 码龄9年 44粉丝 156原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值