我们有两种类型的瓷砖:2 x1 domino形状,和一个“L”tromino形状。这些形状可以旋转。
XX <- domino XX <- "L" tromino X给定N,有多少种方法可以平铺2 x N板? 返回你的答案模10 ^ 9 + 7。
(在平铺中,每个正方形必须用瓷砖覆盖。当且仅当板上有两个4方向相邻的单元时,两个倾斜是不同的,使得正好一个倾斜具有由瓷砖占据的两个正方形。)
Example: Input: 3 Output: 5 Explanation: The five different ways are listed below, different letters indicates different tiles: XYZ XXZ XYY XXY XYY XYZ YYZ XZZ XYY XXY
Note:
- N will be in range
[1, 1000]
.
思路:这道题是道找规律的题目,参考了博客的图片,来看规律,画的真赞:
https://www.cnblogs.com/grandyang/p/9179556.html
可以发现规律:
dp[n] = dp[n-1] + dp[n-2] + 2 * (dp[n-3] + ... + dp[0])
= dp[n-1] + dp[n-3] + dp[n-2] + dp[n-3] + 2 * (dp[n-4] + ... dp[0])
= dp[n-1] + dp[n-3] + dp[n-1]
= 2 * dp[n-1] + dp[n-3]
并且初始化为:dp[0]=1,dp[1]=1,dp[2]=2,还要注意这道题有个坑,除了除的时候需要模1e9+7,在相加的时候:
2 * dp[n-1] + dp[n-3]
也可能会越界,所以定义dp应该为long型。
参考代码:
class Solution {
public:
int numTilings(int N) {
int M = 1e9 + 7;
vector<long> dp(N + 1, 0);
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= N; i++) {
dp[i] = (2 * dp[i - 1] + dp[i - 3])%M;
}
return dp[N];
}
};