1026. 多米诺和三格骨牌铺瓦问题

1026. 多米诺和三格骨牌铺瓦问题

我们有两种瓷砖:一种 2x1 多米诺形状,一种“L”型三格骨牌形状。这些形状可以被旋转。

XX <- 多米诺

 

XX <- 三格骨牌

X

给定N,有多少方法可以铺完一个2 x N的地板?返回答案模 10^9 + 7 之后的结果.

(在铺地板的过程中,一个方格必须被一块砖覆盖。两种铺法是不同的当且仅当在地板上存在两个上下或左右相邻的格子,只有一种铺法使得这两个格子被同一块瓷砖覆盖)

样例

样例 1:

输入: 3

输出: 5

解释: 下列为5种方式, 不同的字母表示不同的瓷砖

1. XYZ 2. XXZ 3. XYY 4. XXY 5. XYY

XYZ YYZ XZZ XYY XXY

样例 2:

输入: 1

输出: 1

注意事项

N 在 [1, 1000] 范围内.

public class Solution {

    /**

     * @param N: a integer

     * @return: return a integer

     */

    public int numTilings(int N) {

        // write your code here

        int mod = 1000000007;

        if (N == 1) {

            return 1;

        } else if (N == 2) {

            return 2;

        }

        // 这里用long,防止溢出

        long[] dp = new long[N];

        dp[0] = 1;

        dp[1] = 2;

        dp[2] = 5;

        for (int i = 3; i < N; i++) {      

            long longSum = (long)dp[i - 1] + (long)dp[i - 2] + (long)dp[i - 3] * 2;

            dp[i] = longSum % mod;

            

            for (int j = (i - 4); j >= 0; j--) {

                dp[i] = (dp[i] + dp[j] * 2) % mod;

            }

            

            dp[i] += 2;

            

            dp[i] = dp[i] % mod;

        }

        return (int)dp[N - 1];

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时代我西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值