Domino and Tromino Tilings
Problem
Count the number of ways to tile a 2 × n strip with 2×1 dominoes (vertical or horizontal) and L-shaped trominoes (each covers three squares). The recurrence is dp[n] = 2·dp[n−1] + dp[n−3] with dp[0]=1, dp[1]=1, dp[2]=2.
Input
n = 4Output
11Trace the recurrence: dp[3]=5, dp[4]=2·5+1=11.
def 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 tilings(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 tilings(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 tilings(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];
}