class Solution {
public:
int numTilings(int n) {
}
};
790. 多米诺和托米诺平铺
有两种形状的瓷砖:一种是 2 x 1
的多米诺形,另一种是形如 "L" 的托米诺形。两种形状都可以旋转。
给定整数 n ,返回可以平铺 2 x n
的面板的方法的数量。返回对 109 + 7
取模 的值。
平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同,当且仅当面板上有四个方向上的相邻单元中的两个,使得恰好有一个平铺有一个瓷砖占据两个正方形。
示例 1:
输入: n = 3 输出: 5 解释: 五种不同的方法如上所示。
示例 2:
输入: n = 1 输出: 1
提示:
1 <= n <= 1000
原站题解
python3 解法, 执行用时: 32 ms, 内存消耗: 14.8 MB, 提交时间: 2022-11-12 11:07:21
MOD = 10 ** 9 + 7 class Solution: def numTilings(self, n: int) -> int: if n == 1: return 1 a, b, c = 1, 1, 2 for _ in range(3, n + 1): a, b, c = b, c, (c * 2 + a) % MOD return c
python3 解法, 执行用时: 36 ms, 内存消耗: 14.9 MB, 提交时间: 2022-11-12 11:05:13
MOD = 10 ** 9 + 7 class Solution: def numTilings(self, n: int) -> int: if n == 1: return 1 f = [0] * (n + 1) f[0] = f[1] = 1 f[2] = 2 for i in range(3, n + 1): f[i] = (f[i - 1] * 2 + f[i - 3]) % MOD return f[n]
java 解法, 执行用时: 3 ms, 内存消耗: 38.4 MB, 提交时间: 2022-11-12 10:54:43
class Solution { public int numTilings(int n) { int mod = 1000000007; List<Integer> dp = new ArrayList<>(); dp.add(0); dp.add(1); dp.add(2); dp.add(5); int sum = 1 + 2 + 5; for (int i = 4; i <= n; i++) { int temp = ((2 * sum) - dp.get(i - 2) - dp.get(i - 1) + 2) % mod; if (temp < 0) temp += mod; dp.add(temp); sum = (sum % mod + dp.get(dp.size() - 1) % mod) % mod; } return dp.get(n) % mod; } }
python3 解法, 执行用时: 52 ms, 内存消耗: 15.1 MB, 提交时间: 2022-11-12 10:50:03
class Solution: def numTilings(self, n: int) -> int: MOD = 10 ** 9 + 7 dp = [[0] * 4 for _ in range(n + 1)] dp[0][3] = 1 for i in range(1, n + 1): 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]