C++轮廓线DP怎么逐格转移铺地砖方案数

浅涛小哥_5233

浅涛小哥_5233

2026-10-04

257人浏览

原创

轮廓线dp状态应定义为dppos,其中pos为当前处理格子编号(0≤pos

c++轮廓线dp怎么逐格转移铺地砖方案数

轮廓线DP状态怎么定义才对得上铺砖的“逐格”要求

轮廓线DP处理铺地砖(如1×2多米诺、L形三连块等)时,状态必须反映「当前决策格子左上方那条锯齿状边界」的覆盖情况——不是整行,也不是整列,而是从左到右、从上到下扫描时,紧贴已处理区域右侧的那条长度为 width + 1 的二进制轮廓线。每一位表示对应位置是否被上方/左侧伸过来的砖块「占用」(即该位置在轮廓线上方已覆盖,不可再放砖起始点)。dp[pos][mask] 中 pos 是当前处理的格子编号(0 ≤ pos height * width),mask 是长度为 width + 1 的整数,低位对应当前行最左列的上方状态。

转移时怎么判断能放哪几种砖、怎么更新mask

对每个 pos,先算出它在网格中的坐标:r = pos / width, c = pos % width。然后根据 mask 的第 c 位(表示该格正上方是否被占)和第 c+1 位(表示该格右侧邻居的「左边界」是否被占,实际用于判断横放砖能否向右延伸)决定可选动作:

  • 若 mask 第 c 位为 0(上方没被占),可竖放一块1×2砖:新 mask 清除第 c 位,设置第 c+1 位(因为砖向下占了下一行同一列,影响下一行该列的「上方」状态)
  • 若 c 且 <code>mask 第 c 位和第 c+1 位都为 0,可横放一块2×1砖:新 mask 清除第 c 和 c+1 位(本行这两列都被填满,不向下延伸)
  • 若允许L形砖等复杂形状,还需检查 c+1 位及下一行对应位(需预取下一行的初始mask位),此时要额外维护「跨行依赖」,容易错位

关键细节:mask 每次转移后需右移一位(模拟扫描到下一格),但最高位由新放置行为决定;边界处(如 c == width - 1)不能横放,且第 width 位只用于承接上一行末尾的向下延伸,本身不对应真实列。

初始化和终态为什么必须用「全0 mask」且只在换行时清高位

第一格(pos=0)的初始 mask 必须是 0,表示整个上边界未被任何砖占用。当处理完某行最后一格(c == width - 1)后,若 mask 的第 width 位为 1,说明有一块竖砖从上一行延伸下来,它正好填满当前行最后一列——这是合法的;但此时要进入下一行,需把整个 mask 左移一位(丢弃第 width 位),并确保新 mask 最低位为 0(下一行首列上方无覆盖)。常见错误是忘记这一步左移,导致下一行首格误判为「上方已被占」。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载

最终答案是 dp[height * width][0],即所有格子处理完、轮廓线回归全空状态的方案数。若终态 mask ≠ 0,说明有砖伸出边界外,应舍弃。

内存和性能上哪些操作真不能省

轮廓线DP状态数是 O(height * width * 2^width),width 超过 12 就极易爆内存。必须用滚动数组:只保留当前 pos 和 pos+1 两层 dp 表,且用 unordered_map<int long></int> 或 vector<long long></long>(索引为 mask)存非零项。别试图用 int 存方案数——稍大网格就会溢出。另外,位运算必须用 (mask >> c) & 1 判断第 c 位,而非 mask & (1 (后者在 <code>c 接近31时可能溢出 int)。

最易忽略的是:不同砖型(比如含1×1空洞或T型)会让状态转移逻辑分支剧增,mask 解释方式也不同;一旦改砖型,几乎要重推所有转移条件,不能只调参数。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2208

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

979

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

407

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

307

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

386

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1389

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1197

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1305

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习