790. Domino and Tromino Tiling ⭐

Medium
You have two types of tiles: a 2 x 1 domino shape and a tromino shape. You may rotate these shapes.
​
​
Given an integer n, return the number of ways to tile an 2 x n board. Since the answer may be very large, return it modulo 109 + 7.
In a tiling, every square must be covered by a tile. Two tilings are different if and only if there are two 4-directionally adjacent cells on the board such that exactly one of the tilings has both squares occupied by a tile.
Example 1:
​
​
Input: n = 3
Output: 5
Explanation: The five different ways are show above.
Example 2:
Input: n = 1
Output: 1
Constraints:
  • 1 <= n <= 1000

解題

func numTilings(n int) int {
dp := make([][]int, n + 1)
for i:=0; i<=n; i++ {
dp[i] = make([]int, 2)
}
// dp[i][1] 是凸出來一個角 dp[i][0] 是完整的長方形
dp[0][0], dp[1][0] = 1, 1
for i:=2; i<=n; i++ {
dp[i][0] = (dp[i - 1][0] + dp[i - 2][0] + 2 * dp[i - 1][1]) % 1000000007
dp[i][1] = (dp[i - 2][0] + dp[i - 1][1]) % 1000000007
}
​
return dp[n][0]
}