【每日一题Day25】LC790多米诺和托米诺平铺 | 状态机DP

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

多米诺和托米诺平铺【LC790】


You have two types of tiles: a 2 x 1 domino shape and a tromino shape. You may rotate these shapes.


9cbcf3f67ee730b02c6f529680d105c6.jpg


Given an integer n, return the number of ways to tile an 2 x n board. Since the answer may be very large, return it modulo 109 + 7.


In a tiling, every square must be covered by a tile. Two tilings are different if and only if there are two 4-directionally adjacent cells on the board such that exactly one of the tilings has both squares occupied by a tile.


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


9cbcf3f67ee730b02c6f529680d105c6.jpg


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


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


又是没做过的题型


  • 思路:使用状态机DP,定义第i列瓷砖的四种不同状态【未铺满】,第i列瓷砖的状态可由前一列的瓷砖状态得到,最终dp[i][1]即为前i列瓷砖被铺满的方案数


。j=0时,代表第i列未被填充

。j=1时,代表第i列两个方块均被填充

。j=2时,代表第i列上面的方块被填充

。j=3时,代表第i列下面的方块被填充


动态规划实现


1.确定dp数组(dp table)以及下标的含义


dp[i][j]:当前i-1列铺满时,当前第i列状态为j时的方案数


j的取值范围为[0,4)


。j=0时,代表第i列未被填充

。j=1时,代表第i列两个方块均被填充

。j=2时,代表第i列上面的方块被填充

。j=3时,代表第i列下面的方块被填充


2.确定递推公式


。dp[i][0]:前i-1列被填充满,第i列未被填充


  • 只能由dp[i-1][1]转移:在第i-1列竖放2*1的骨牌


dp[i][0] = dp[i-1][0]


。dp[i][1]:前i列均被填充


  • 由dp[i-1][0]转移:在第i-1列和第i列横放1*2的骨牌


  • 由dp[i-1][1]转移:在第i-1列和第i列竖放2*1的骨牌


  • 由dp[i-1][2]转移:横放一块L型骨牌


  • 由dp[i-1][3]转移:横放一块L型骨牌


dp[i][1] =dp[i-1][0]+ dp[i-1][1] + dp[i-1][2] + dp[i-1][3]


。dp[i][2]:前i-1列被填充满、第i列上面的方块被填充


  • 由dp[i-1][0]转移:横放一块L型骨牌


  • 由dp[i-1][3]转移:横放一块L型骨牌


dp[i][2] = dp[i-1][0] + dp[i-1][3]


。dp[i][3]:前i-1列被填充满、第i列下面的方块被填充


  • 由dp[i-1][0]转移:横放一块L型骨牌


  • 由dp[i-1][2]转移:横放一块L型骨牌


dp[i][3] = dp[i-1][0] + dp[i-1][2]


3.dp数组如何初始化


dp[1][0]=1
dp[1][1]=1
dp[1][2]=0
dp[1][3]=0


4.确定遍历顺序


。正序遍历i


5.举例推导dp数组



dp[i][0]
dp[i][1] dp[i][2] dp[i][3]
1 1 1 0 0
2 1 2 1 1
3 2 5 2 2
4 5 11 4 4


  • 代码


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


。复杂度


  • 时间复杂度:O ( n )


  • 空间复杂度:O ( n )


  • 滚动数组优化


。int a = i & 1


奇数1 偶数0,确定下标


。int b = (i - 1) & 1


奇数0 偶数1


class Solution {
    public int numTilings(int n) {
        int MOD = (int)1e9 + 7;
        int[][] dp = new int[2][4];
        dp[1][0] = 1;
        dp[1][1] = 1;
        for (int i = 2; i <= n; i++){
            int a = i & 1;// 奇数1 偶数0
            int b = (i-1) & 1;// 奇数0 偶数1
            dp[a][0] = dp[b][1];
            int cur = 0;
            for (int j = 0; j < 4; j++){
                cur = (cur + dp[b][j]) % MOD;
            }
            dp[a][1] = cur;
            dp[a][2] = (dp[b][0] + dp[b][3]) % MOD;
            dp[a][3] = (dp[b][0] + dp[b][2]) % MOD;
        }
        return dp[n & 1][1];
    }
}


。复杂度


  • 时间复杂度:O ( n )


  • 空间复杂度:O ( 1 )
目录
相关文章
|
机器学习/深度学习 缓存 并行计算
NVIDIA Tesla GPU系列P4、T4、P40以及V100参数性能对比
NVIDIA Tesla系列GPU适用于高性能计算(HPC)、深度学习等超大规模数据计算,Tesla系列GPU能够处理解析PB级的数据,速度比使用传统CPU快几个数量级,NVIDIA Tesla GPU系列P4、T4、P40以及V100是Tesla GPU系列的明星产品,云服务器吧分享NVIDIA.
83731 1
|
消息中间件 JSON API
使用 REST API 操作 RabbitMQ(一)
使用 REST API 操作 RabbitMQ
388 0
|
监控 搜索推荐 算法
电商数据分析常用业务指标整理(共72个)
电商数据分析常用业务指标整理(共72个)
PE安装原版XP系统(含高版本PE安装选项灰色处理办法)
PE 安装 XP 镜像流程准备原版 XP 安装光盘镜像放到硬盘非 C 盘。 可解压到本地经行安装, 也可以使用虚拟光驱载入安装(本教程主要讲 PE 内虚拟光驱载入安装)第一步:用 U 盘或硬盘/光盘启动进 PE,并将 C 盘快速格式化。
4297 0
|
15天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
7天前
|
云安全 人工智能 安全
Dify平台集成阿里云AI安全护栏,构建AI Runtime安全防线
阿里云 AI 安全护栏加入Dify平台,打造可信赖的 AI
|
10天前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
931 29