LC-790.多米诺和托米诺平铺
题目描述
有两种形状的瓷砖:一种是 2 x 1 的多米诺形,另一种是形如 “L” 的托米诺形。两种形状都可以旋转。
给定整数 n ,返回可以铺满 2 x n 的面板的方法的数量。返回对 10e9 + 7 取模 的值。
注意下图中的 1-3 方案,是白色瓷砖而不是没铺满,不要产生误解

找规律
- f(1) = 1
- f(2) = 2
- f(3) = 5
- f(4) = 11 = 5 * 2 + 1 = f(3) * 2 + f(1)
- f(5) = 24 = 11 * 2 + 2 = f(4) * 2 + f(2)
得出 f(i) = 2 * (f - i) + f(i - 3),其中 i > 3
1 | |
找规律 + 滚动数组
可以发现最多会往前依赖到 i - 3,那么只需要保存最近的三个结果即可。
但这里为了方便(抖机灵),保存了 4 个结果。因为对 2 的 n 次方的取模运算,可以转换成对 n - 1 的与运算。
1 | |
这种类型的题目由于结果固定,且数据范围有限,还能用第一种解法 + 打表对结果进行保存,由于做法类似就不在这里列出了。
动态规划
定义 dp[i][j] 为: 在第 i 列前面的正方形都被瓷砖覆盖,当前第 i 列状态为 j 时的方案数。那么第 i 列的正方形有四种(即 j 取值范围)被覆盖的情况:
第 i 列为空,j 为 0;
第 i 列上方格子为空,j为 1;
第 i 列下方格子为空,j为 2;
第 i 列为满,j为 3。
那么状态转移如下:

1 | |
动态规划 + 滚动数组
类似于 找规律 + 滚动数组 的优化,dp[i]只往前依赖于 dp[i - 1],所以可以把数组的第一维优化成 2。
稍微要注意的是,由于 0、1、2、3 状态之间存在相互依赖,所以无法优化成一维数组。
1 | |
矩阵快速幂
1 | |
LC-790.多米诺和托米诺平铺
https://wecgwm.github.io/2022/11/12/LC-790-多米诺和托米诺平铺/