Domino and Tromino Tiling

medium dp recurrence

Problem

We have two types of tiles: a 2x1 domino shape, and an "L" tromino shape. These shapes may be rotated. XX <- domino XX <- "L" tromino X Given N, how many ways are there to tile a 2 x N board?

Inputn = 4
Output11
Trace the recurrence: dp[3]=5, dp[4]=2·5+1=11.

def num_tilings(n):
    if n == 0: return 1
    if n <= 2: return n
    dp = [1, 1, 2]
    for i in range(3, n + 1):
        dp.append(2 * dp[i - 1] + dp[i - 3])
    return dp[n]
function numTilings(n) {
  if (n === 0) return 1;
  if (n <= 2) return n;
  const dp = [1, 1, 2];
  for (let i = 3; i <= n; i++) dp.push(2 * dp[i - 1] + dp[i - 3]);
  return dp[n];
}
class Solution {
    public int numTilings(int n) {
        if (n == 0) return 1;
        if (n <= 2) return n;
        int[] dp = new int[n + 1];
        dp[0] = 1; dp[1] = 1; dp[2] = 2;
        for (int i = 3; i <= n; i++) dp[i] = 2 * dp[i - 1] + dp[i - 3];
        return dp[n];
    }
}
int numTilings(int n) {
    if (n == 0) return 1;
    if (n <= 2) return n;
    vector<int> dp(n + 1);
    dp[0] = 1; dp[1] = 1; dp[2] = 2;
    for (int i = 3; i <= n; i++) dp[i] = 2 * dp[i - 1] + dp[i - 3];
    return dp[n];
}
Time: O(n) Space: O(n)