这个题解使用动态规划的思路来解决多米诺和托米诺平铺问题。通过观察可以发现,对于第i列,其状态只与前三列(i-1, i-2, i-3)有关。因此,可以使用一个一维数组f来记录状态,其中f[i]表示平铺2 x i的面板的方法数量。初始条件为f[0]=f[1]=1,f[2]=2。对于i>2的情况,可以通过状态转移方程f[i] = (f[i-1]*2+f[i-3]) mod 10^9+7来计算f[i]的值,最终返回f[n]即可得到答案。
时间复杂度: O(n)
空间复杂度: O(n)
Mod = 10**9+7
class Solution:
def numTilings(self, n: int) -> int:
if n == 1:
return 1
f = [0]*(n+1) # 创建一个长度为n+1的数组f用于存储状态
f[0] = f[1] = 1 # 初始条件:平铺2x0和2x1的面板的方法数为1
f[2] = 2 # 初始条件:平铺2x2的面板的方法数为2
for i in range(3,n+1): # 从i=3开始遍历到n
f[i] = (f[i-1]*2+f[i-3])%Mod # 状态转移方程:f[i] = (f[i-1]*2+f[i-3]) mod 10^9+7
return f[-1] # 返回f[n]即为最终答案