790. 多米诺和托米诺平铺

有两种形状的瓷砖:一种是 2 x 1 的多米诺形,另一种是形如 “L” 的托米诺形。两种形状都可以旋转。
image.png

给定整数 n ,返回可以平铺 2 x n 的面板的方法的数量。返回对 109 + 7 取模 的值。
平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同,当且仅当面板上有四个方向上的相邻单元中的两个,使得恰好有一个平铺有一个瓷砖占据两个正方形。

dp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
private static final int MOD = 1000000007;
public int numTilings(int n) {
if (n == 1) return 1;
if (n == 2) return 2;

// d[i][0] => 第 i 列上面占位
// d[i][1] => 第 i 列下面占位
// d[i][2] => 第 i 列都占位
int[][] d = new int[n][3];
d[0][2] = 1;
d[1][0] = 1;
d[1][1] = 1;
d[1][2] = 2;

for (int i = 2; i < n; i++) {
d[i][0] = (d[i - 1][1] + d[i - 2][2]) % MOD;
d[i][1] = (d[i - 1][0] + d[i - 2][2]) % MOD;
d[i][2] = (((d[i - 1][2] + d[i - 2][2]) % MOD + d[i - 1][0]) % MOD + d[i - 1][1]) % MOD;
}

return d[n - 1][2];
}
}

矩阵快速幂

TODO