有两种形状的瓷砖:一种是 2 x 1
的多米诺形,另一种是形如 "L" 的托米诺形。两种形状都可以旋转。
给定整数 n ,返回可以平铺 2 x n
的面板的方法的数量。返回对 109 + 7
取模 的值。
平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同,当且仅当面板上有四个方向上的相邻单元中的两个,使得恰好有一个平铺有一个瓷砖占据两个正方形。
示例 1:
输入: n = 3 输出: 5 解释: 五种不同的方法如上所示。
示例 2:
输入: n = 1 输出: 1
实现:
class Solution:
def numTilings(self, n: int) -> int:
# """动态规划:f[i][0]为平铺了前面i-1层,并且第i层什么都没有
# f[i][1]为平铺了前面i-1层,并且第i层出来的第一行的那个
# f[i][2]为平铺了前面i-1层,并且第i层出来的第二行的那个
# f[i][3]为平铺了前面i-1层,并且第i层出来的第三行的那个
mod = 10**9 + 7
f = [[0]*4 for _ in range(n+1)]
f[0][3] = 1
for i in range(1, n+1):
f[i][0] = f[i-1][3] #第i-1层铺满
f[i][1] = (f[i-1][0] + f[i-1][2]) % mod
f[i][2] = (f[i-1][0] + f[i-1][1]) % mod
f[i][3] = (((f[i-1][0] + f[i-1][1]) % mod + f[i-1][2]) % mod + f[i-1][3]) % mod
return f[n][3]