题目描述
有两种形状的瓷砖:一种是 2 x 1 的多米诺形,另一种是形如 “L” 的托米诺形。两种形状都可以旋转。给定整数 n ,返回可以平铺 2 x n 的面板的方法的数量。返回对 109 + 7 取模 的值。平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同,当且仅当面板上有四个方向上的相邻单元中的两个,使得恰好有一个平铺有一个瓷砖占据两个正方形。
解析
题目最后一句翻译成人话就是用这两种瓷砖要铺满且不能有重合。动态规划,对当前的位置分成四种情况:上下两个都是空,上空,下空和都是满的。
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];
}
}
由于上面的过程可以写成矩阵乘法,可以用快速幂来计算。
class Solution {
static final int MOD = 1000000007;
public int numTilings(int n) {
int[][]

最低0.47元/天 解锁文章
2029

被折叠的 条评论
为什么被折叠?



