1026. 多米诺和三格骨牌铺瓦问题
我们有两种瓷砖:一种 2x1 多米诺形状,一种“L”型三格骨牌形状。这些形状可以被旋转。
XX <- 多米诺
XX <- 三格骨牌
X
给定N,有多少方法可以铺完一个2 x N的地板?返回答案模 10^9 + 7 之后的结果.
(在铺地板的过程中,一个方格必须被一块砖覆盖。两种铺法是不同的当且仅当在地板上存在两个上下或左右相邻的格子,只有一种铺法使得这两个格子被同一块瓷砖覆盖)
样例
样例 1:
输入: 3
输出: 5
解释: 下列为5种方式, 不同的字母表示不同的瓷砖
1. XYZ 2. XXZ 3. XYY 4. XXY 5. XYY
XYZ YYZ XZZ XYY XXY
样例 2:
输入: 1
输出: 1
注意事项
N 在 [1, 1000] 范围内.
public class Solution {
/**
* @param N: a integer
* @return: return a integer
*/
public int numTilings(int N) {
// write your code here
int mod = 1000000007;
if (N == 1) {
return 1;
} else if (N == 2) {
return 2;
}
// 这里用long,防止溢出
long[] dp = new long[N];
dp[0] = 1;
dp[1] = 2;
dp[2] = 5;
for (int i = 3; i < N; i++) {
long longSum = (long)dp[i - 1] + (long)dp[i - 2] + (long)dp[i - 3] * 2;
dp[i] = longSum % mod;
for (int j = (i - 4); j >= 0; j--) {
dp[i] = (dp[i] + dp[j] * 2) % mod;
}
dp[i] += 2;
dp[i] = dp[i] % mod;
}
return (int)dp[N - 1];
}
}