题目描述
有两种形状的瓷砖:一种是 2 x 1 的多米诺形,另一种是形如 “L” 的托米诺形。两种形状都可以旋转。
给定整数 n ,返回可以平铺 2 x n 的面板的方法的数量。返回对 10 ^9 + 7 取模 的值。
平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同,当且仅当面板上有四个方向上的相邻单元中的两个,使得恰好有一个平铺有一个瓷砖占据两个正方形。
输入: n = 3
输出: 5
解释: 五种不同的方法如上所示。
求解思路
- 首先这是一道通过动态规划求解的题目。
- 这道题目没有很好的思路,可以参考官方题解。【官方题解】
- 还有矩阵快速幂的解决方案。
实现代码
class Solution {
static final int MOD = 1000000007;
public int numTilings(int n) {
int[][] dp = new int[n + 1][4];
dp[0][3] = 1;
for (int i = 1; i <= n; i++) {
dp[i][0] = dp[i - 1][3];
dp[i][1] = (dp[i - 1][0] + dp[i - 1][2]) % MOD;
dp[i][2] = (dp[i - 1][0] + dp[i - 1][1]) % MOD;
dp[i][3] = (((dp[i - 1][0] + dp[i - 1][1]) % MOD + dp[i - 1][2]) % MOD + dp[i - 1][3]) % MOD;
}
return dp[n][3];
}
}