记录一下思路:
参考大神花花酱的图https://www.youtube.com/watch?v=S-fUTfqrdq8
状态转移公式不好找,可以尝试画图。题目只有两行,算是降低了难度。从列入手,填到第i列时,要么上下行都填满,要么上行填满,要么下行填满。
设置二维dp,dp[i][0], dp[i][1],dp[i][2],分别代表两行满,上行满,下行满。
于是可知:dp[i][0] = dp[i-1][0] +dp[i-2][0] + dp[i-1][1] +dp[i-1][2]
dp[i][1] = dp[i-2][0] + dp[i-1][2]
dp[i][2] = dp[i-2][0] + dp[i-1][1]
class Solution:
def numTilings(self, N: int) -> int:
Mod = 10**9 + 7
if N == 1:return 1
if N == 2:return 2
dp = [[0 for _ in range(3)] for _ in range(N+1)]
dp[1][0] = 1
dp[2][0] = 2
dp[2][1] = 1
dp[2][2] = 1
for i in range(3, N + 1):
dp[i][0] = (dp[i-1][0] + dp[i-2][0] + dp[i-1][1] + dp[i-1][2]) % Mod
dp[i][1] = (dp[i-1][2] + dp[i-2][0]) % Mod
dp[i][2] = (dp[i-1][1] + dp[i-2][0]) % Mod
return dp[-1][0]