Domino and Tromino Tiling 多米诺骨牌和三格骨牌瓷砖

我们有两种类型的瓷砖: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];
    }
};



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值