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-多米诺和托米诺平铺/