LeetCode每日一题——790. 多米诺和托米诺平铺

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

题目

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

2345_image_file_copy_7.jpg

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

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

示例

示例 1:

2345_image_file_copy_8.jpg

输入: n = 3

输出: 5

解释: 五种不同的方法如上所示。

示例 2:

输入: n = 1

输出: 1

提示:

1 <= n <= 1000

思路

动态规划:

dp数组定义为dp[i][0]表示到达i-1块全部填满的可能情况,dp[i][0]表示到达i-1块缺一块的可能情况(这里缺的一块不分上下)。

状态转移方程为:

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

2.dp[i][1]=dp[i-2][0]*2+dp[i-1][1]

题解

class Solution:
    def numTilings(self, n: int) -> int:
    # n=1,2的情况直接返回
        if n==1:return 1
        if n==2:return 2
        dp=[[0]*2 for _ in range(n)]
        # 赋边界值
        dp[0]=[1,0]
        dp[1]=[2,2]
        for i in range(2,n):
            dp[i][0]=dp[i-1][0]+dp[i-2][0]+dp[i-1][1]
            dp[i][1]=dp[i-2][0]*2+dp[i-1][1]
        return dp[-1][0]%(10**9+7)
目录
相关文章
|
4月前
acwing 1106 山峰和山谷
acwing 1106 山峰和山谷
24 0
|
9月前
leetcode-735:行星碰撞
leetcode-735:行星碰撞
52 0
|
机器学习/深度学习 人工智能 算法
算法在左,迷信向右 | 彭文华
算法在左,迷信向右 | 彭文华
《蓝桥杯每日一题》递推·AcWing 3777. 砖块
《蓝桥杯每日一题》递推·AcWing 3777. 砖块
86 0
洛谷P1162 填涂颜色——广搜
洛谷P1162 填涂颜色——广搜
87 0
|
存储
【蓝桥杯集训·每日一题】AcWing 1079. 叶子的颜色
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 树形DP
79 0
【寒假每日一题】AcWing 4652. 纸张尺寸
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
96 0
|
人工智能 移动开发
【蓝桥杯集训·每日一题】AcWing 3805. 环形数组
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 线段树
114 0
|
C++
【力扣·每日一题】807. 保持城市天际线(C++ 贪心)
【力扣·每日一题】807. 保持城市天际线(C++ 贪心)
116 0
【力扣·每日一题】807. 保持城市天际线(C++ 贪心)
|
存储 算法 vr&ar
【力扣·周赛】第 284 场周赛(C++ | 枚举 | 分类讨论 | 最短路 | 建反图)
【力扣·周赛】第 284 场周赛(C++ | 枚举 | 分类讨论 | 最短路 | 建反图)
143 0
【力扣·周赛】第 284 场周赛(C++ | 枚举 | 分类讨论 | 最短路 | 建反图)