洛谷 1990 覆蓋牆壁 遞推

洛谷 1990 覆蓋牆壁

https://www.luogu.com.cn/problem/P1990

題目描述
你有一個長爲N寬爲2的牆壁,給你兩種磚頭:一個長2寬1,另一個是L型覆蓋3個單元的磚頭。如下圖:

0 0
0 00
磚頭可以旋轉,兩種磚頭可以無限制提供。你的任務是計算用這兩種來覆蓋N2的牆壁的覆蓋方法。例如一個23的牆可以有5種覆蓋方法,如下:

012 002 011 001 011
012 112 022 011 001
注意可以使用兩種磚頭混合起來覆蓋,如2*4的牆可以這樣覆蓋:

0112
0012
給定N,要求計算2N的牆壁的覆蓋方法。由於結果很大,所以只要求輸出最後4位。例如213的覆蓋方法爲13465,只需輸出3465即可。如果答案少於4位,就直接輸出就可以,不用加0,如N=3,時輸出5。

輸入格式
一個整數N(1<=N<=1000000),表示牆壁的長。

輸出格式
輸出覆蓋方法的最後4位,如果不足4位就輸出整個答案。

輸入輸出樣例
輸入 #1複製
13
輸出 #1複製
3465

dp[i][j]表示第i列的第j中狀態
j=0時,代表第i列已滿
j=1時,代表第i列差一個
分兩種情況,根據之前數據進行遞推,注意不要漏掉情況

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const long long mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const double PI = 3.141592;
const int e = 1e6;

ll dp[e + 5][2];

int main()
{
    ll n;
    scanf("%lld", &n);
    memset(dp, 0, sizeof(dp));
    dp[0][0] = 1;
    dp[1][0] = 1;
    for(int i = 2; i <= n; i++){
        dp[i][0] = (dp[i - 1][0] + dp[i - 2][0] + 2 * dp[i - 1][1]) % 10000;
        dp[i][1] = (dp[i - 2][0] + dp[i - 1][1]) % 10000;
    }
    cout << dp[n][0] % 10000 << endl;
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章