有两种形状的瓷砖:一种是 2 x 1 的多米诺形,另一种是形如 “L” 的托米诺形。两种形状都可以旋转。
给定整数 n ,返回可以平铺 2 x n 的面板的方法的数量。返回对 109 + 7 取模 的值。
平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同,当且仅当面板上有四个方向上的相邻单元中的两个,使得恰好有一个平铺有一个瓷砖占据两个正方形。
class Solution:
def numTilings(self, n: int) -> int:
MOD = 10 ** 9 + 7
dp = [[0] * 4 for _ in range(n + 1)]
dp[0][3] = 1
for i in range(1, n + 1):
dp[i][0] = dp[i - 1][3]
dp[i][1] = (dp[i - 1][0] + dp[i - 1][2]) % MOD
dp[i][2] = (dp[i - 1][0] + dp[i - 1][1]) % MOD
dp[i][3] = (((dp[i - 1][0] + dp[i - 1][1]) % MOD + dp[i - 1][2]) % MOD + dp[i - 1][3]) % MOD
return dp[n][3]
心得体会:
考虑这么一种平铺的方式:在第 iii 列前面的正方形都被瓷砖覆盖,在第 iii 列后面的正方形都没有被瓷砖覆盖(iii 从 111 开始计数)。那么第 iii 列的正方形有四种被覆盖的情况:
一个正方形都没有被覆盖,记为状态 000;
只有上方的正方形被覆盖,记为状态 111;
只有下方的正方形被覆盖,记为状态 222;
上下两个正方形都被覆盖,记为状态 333。