每日一道leetcode

news2025/5/14 6:52:23

790. 多米诺和托米诺平铺 - 力扣(LeetCode)

题目

有两种形状的瓷砖:一种是 2 x 1 的多米诺形,另一种是形如 "L" 的托米诺形。两种形状都可以旋转。

给定整数 n ,返回可以平铺 2 x n 的面板的方法的数量。返回对 109 + 7 取模 的值。

平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同,当且仅当面板上有四个方向上的相邻单元中的两个,使得恰好有一个平铺有一个瓷砖占据两个正方形。

示例 1:

输入: n = 3
输出: 5
解释: 五种不同的方法如上所示。

示例 2:

输入: n = 1
输出: 1

提示:

  • 1 <= n <= 1000

思路(纯脑洞,没实现)

  1. 这题看起来是个排列组合题,先从全铺domino的情况开始,逐渐减少domino再看是否能加上tromino。
  2. 确定完最外层的逻辑考虑哪些组合能铺满,再考虑每个组合怎么铺:
    1. 首先是domino和domino的组合,一般只能横着或竖着铺:
      1. 横着下面必然也得需要一个domino,所以消耗2个domino,占4格,因为对称性,所以只有1种组合方式;
      2. 竖着可以单独组合,消耗1个domino,占2格,1种组合方式。
    2. 然后是tromino和tromino的组合,只能交叉嵌入,消耗2个tromino,占6格,有2种组合方式。
    3. 最后是domino和tromino的组合,只能是两个对称的tromino夹着一个domino,消耗2个tromino和1个domino,占8格,有两种组合方式。
  3. 根据上述情况,这个问题就变成了怎么解有重复元素的排列问题(好吧怎么把组合罗列出来也挺麻烦的)。

    官方题解

    • 官方题解还是动态规划的方法,但是它列在了一维动态规划的题型里迷惑性太强了,一直在想一维数组怎么可能表达2*n的格子呢,不过确实不是我想得到的。

    思路

    1. 总的来说就是按列分状态讨论情况,该列会有4中情况:上下都空,只有上面有,只有下面有,上下都有。因为到达每列前,之前的列都处理完了,所以每种状态可由不同的状态转移过来:
      1. 上下都空:前面只有可能全满,也就是状态4转移过来。
      2. 只有上面有:前一列可能是上下都空,然后插入一个上面凸起的tromino;也可能是只有下面有,然后再上面插入一个domino。
      3. 只有下面有:跟只有上面有对称。
      4. 上下都有:前一列可能全空,铺了两个domino;也可能只有上面或下面,补了一个tromino;也可能全满,这时候就在本列补一个domino即可。
    2. 官解定义了状态转移方程如上,补充第一列的初始状态dp[0][0]=0,dp[0][1]=0,dp[0][2]=0,dp[0][3]=1,前三种方案不存在所以是0,往后迭代就有了(dp[i]考虑的都是第i-1列的情况,让dp[0][3]等于1其实就是考虑初始状态什么都没放的时候的一种初始状态,可以理解成一个额外的前置列全满,为了传递给后一项,所以需要放在状态3)。
    3. 因为加法会溢出,所以尽量每次加法都取一下模。

    代码实现

    class Solution {
    public:
        int numTilings(int n) {
            int dp[n+1][4];
            long long mod = 1e9 + 7;
            dp[0][0] = 0;
            dp[0][1] = 0;
            dp[0][2] = 0;
            dp[0][3] = 1;
            for(int i = 1; i <= n; i++) {
                dp[i][0] = dp[i-1][3] % mod;
                dp[i][1] = (dp[i-1][0] + dp[i-1][2]) % mod;
                dp[i][2] = (dp[i-1][0] + dp[i-1][1]) % mod;
                dp[i][3] = (dp[i-1][0] + dp[i-1][1] + dp[i-1][2] + dp[i-1][3]) % mod;
            }
            return dp[n][3];
        }
    };

    复杂度分析

    • 时间复杂度:O(n)。
    • 空间复杂度:O(1)。

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2375184.html

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

    相关文章

    CD3MN 双相钢 2205 材质保温 V 型球阀:恒温工况下复杂介质控制的高性能之选-耀圣

    CD3MN 双相钢 2205 材质保温 V 型球阀&#xff1a;恒温工况下复杂介质控制的高性能之选 在石油化工、沥青储运、食品加工等行业中&#xff0c;带颗粒高粘度介质与料浆的恒温输送面临着腐蚀、磨损、堵塞等多重挑战。普通阀门难以兼顾耐高温、强密封与耐腐蚀性&#xff0c;导致设…

    python酒店健身俱乐部管理系统

    目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…

    嵌入式开发学习(第二阶段 C语言基础)

    综合案例《猜拳游戏》 需求&#xff1a; 本游戏是一款单机游戏&#xff0c;人机交互 规则&#xff1a; 需要双方出拳&#xff1a;石头、剪刀、布赢&#xff1a; 石头→剪刀剪刀→ 布布 →石头 两边出拳相等输&#xff1a; … 实现&#xff1a; 选择对手玩家出拳对手出拳判断胜…

    YOLOv1:开启实时目标检测的新篇章

    YOLOv1&#xff1a;开启实时目标检测的新篇章 在深度学习目标检测领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;系列算法无疑占据着重要地位。其中&#xff0c;YOLOv1作为开山之作&#xff0c;以其独特的设计理念和高效的检测速度&#xff0c;为后续的目标…

    FFmpeg多路节目流复用为一路包含多个节目的输出流

    在音视频处理领域&#xff0c;将多个独立的节目流&#xff08;如不同频道的音视频内容&#xff09;合并为一个包含多个节目的输出流是常见需求。FFmpeg 作为功能强大的多媒体处理工具&#xff0c;提供了灵活的流复用能力&#xff0c;本文将通过具体案例解析如何使用 FFmpeg 实现…

    分子动力学模拟揭示点突变对 hCFTR NBD1结构域热稳定性的影响

    囊性纤维化&#xff08;CF&#xff09; 作为一种严重的常染色体隐性遗传疾病&#xff0c;全球约有 10 万名患者深受其害。它会累及人体多个器官&#xff0c;如肺部、胰腺等&#xff0c;严重影响患者的生活质量和寿命。CF 的 “罪魁祸首” 是 CFTR 氯离子通道的突变&#xff0c;…

    关于SIS/DCS点检周期

    在中国化工行业&#xff0c;近几年在设备维护上有个挺有意思的现象&#xff0c;即SIS和DCS这两个系统的点检周期问题&#xff0c;隔三差五就被管理层会议讨论&#xff0c;可以说是企业管理层关注的重要方向与关心要素。 与一般工业行业中设备运维不同&#xff0c;SIS与DCS的点…

    【PmHub后端篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现

    1 限流的重要性 在高并发系统中&#xff0c;保护系统稳定运行的关键技术有缓存、降级和限流。 缓存通过在内存中存储常用数据&#xff0c;减少对数据库的访问&#xff0c;提升系统响应速度&#xff0c;如浏览器缓存、CDN缓存等多种应用层面。降级则是在系统压力过大或部分服务…

    CST软件仿真案例——太阳能薄膜频谱吸收率

    CST软件中的太阳能薄膜的功率吸收可用光频电磁波在介质材料中的损耗来计算。本案例计算非晶硅的功率吸收&#xff0c;然后考虑真实太阳频谱&#xff0c;计算有效吸收频谱。 用太阳能单元模板&#xff0c;时域求解器&#xff1a; 材料库提取四个材料&#xff0c;非晶硅&#xf…

    ABAP+旧数据接管的会计年度未确定

    导资产主数据时&#xff0c;报错旧数据接管的会计年度未确定 是因为程序里面使用了下列函数AISCO_CALCULATE_FIRST_DAY&#xff0c;输入公司代码&#xff0c;获取会计年度&#xff0c;这个数据是在后台表T093C表中取数的&#xff0c;通过SE16N可以看到后台表数据没有数&#xf…

    养生:打造健康生活的全方位策略

    在生活节奏不断加快的当下&#xff0c;养生已成为提升生活质量、维护身心平衡的重要方式。从饮食、运动到睡眠&#xff0c;再到心态调节&#xff0c;各个方面的养生之道共同构建起健康生活的坚实基础。以下为您详细介绍养生的关键要点&#xff0c;助您拥抱健康生活。 饮食养生…

    贪吃蛇游戏排行榜模块开发总结:从数据到视觉的实现

    一、项目背景与成果概览 在完成贪吃蛇游戏核心玩法后,本次开发重点聚焦于排行榜系统的实现。该系统具备以下核心特性: 🌐 双数据源支持:本地存储(localStorage)与远程API自由切换 🕒 时间维度统计:日榜/周榜/月榜/全时段数据筛选 🎮 模式区分:闯关模式(关卡进度…

    屏幕与触摸调试

    本章配套视频介绍: 《28-屏幕与触摸设置》 【鲁班猫】28-屏幕与触摸设置_哔哩哔哩_bilibili LubanCat-RK3588系列板卡都支持mipi屏以及hdmi显示屏的显示。 19.1. 旋转触摸屏 参考文章 触摸校准 参考文章 旋转触摸方向 配置触摸旋转方向 1 2 # 1.查看触摸输入设备 xinput…

    使用 百度云大模型平台 做 【提示词优化】

    1. 百度云大模型平台 百度智能云千帆大模型平台 &#xfeff; 平台功能&#xff1a;演示了阿里云大模型的百炼平台&#xff0c;该平台提供Prompt工程功能&#xff0c;支持在线创建和优化Prompt模板模板类型&#xff1a;平台提供多种预制模板&#xff0c;同时也支持用户自定义…

    IJCAI 2025 | 高德首个原生3D生成基座大模型「G3PT」重塑3D生成的未来

    国际人工智能联合会议&#xff08;IJCAI&#xff09;是人工智能领域最古老、最具权威性的学术会议之一&#xff0c;自1969年首次举办以来&#xff0c;至今已有近六十年的历史。它见证了人工智能从萌芽到蓬勃发展的全过程&#xff0c;是全球人工智能研究者、学者、工程师和行业专…

    Samtec助力电视广播行业

    【摘要前言】 现代广播电视技术最有趣的方面之一就是界限的模糊。过去&#xff0c;音频和视频是通过射频电缆传输的模拟技术采集的&#xff0c;而现在&#xff0c;数字世界已经取代了模拟技术。物理胶片和磁带已让位于数字存储设备和流媒体。 在这个过程中&#xff0c;连接器…

    密码学--仿射密码

    一、实验目的 1、通过实现简单的古典密码算法&#xff0c;理解密码学的相关概念 2、理解明文、密文、加密密钥、解密密钥、加密算法、解密算法、流密码与分组密码等。 二、实验内容 1、题目内容描述 ①随机生成加密密钥&#xff0c;并验证密钥的可行性 ②从plain文件读入待…

    SpringBoot整合MQTT实战:基于EMQX实现双向设备通信(附源码)

    简言&#xff1a; 在万物互联的时代&#xff0c;MQTT协议凭借其轻量级、高效率的特性&#xff0c;已成为物联网通信的事实标准。本教程将带领您在Ubuntu系统上搭建EMQX 5.9.0消息服务器&#xff0c;并使用Spring Boot快速实现两个客户端的高效通信。通过本指南&#xff0c;您将…

    从零开始掌握FreeRTOS(2)链表之节点的定义

    目录 节点 节点定义 节点实现 根节点 根节点定义 精简节点定义 根节点实现 在上篇文章,我们完成了 FreeRTOS 的移植。在创建任务之前,我们需要先了解FreeRTOS的运转机制。 FreeRTOS是一个多任务系统,由操作系统来管理执行每个任务。这些任务全都挂载到一个双向循…

    【数据结构】——双向链表

    一、链表的分类 我们前面学习了单链表&#xff0c;其是我们链表中的其中一种&#xff0c;我们前面的单链表其实全称是单向无头不循环链表&#xff0c;我们的链表从三个维度进行分类&#xff0c;一共分为八种。 1、单向和双向 可以看到第一个链表&#xff0c;其只能找到其后一个…