洛谷[P1990] 覆蓋牆壁
阿新 • • 發佈:2021-09-19
題目描述
你有一個長為N寬為2的牆壁,給你兩種磚頭:一個長2寬1,另一個是L型覆蓋3個單元的磚頭。如下圖:
0 0
0 00
磚頭可以旋轉,兩種磚頭可以無限制提供。你的任務是計算用這兩種來覆蓋N*2的牆壁的覆蓋方法。例如一個2*3的牆可以有5種覆蓋方法,如下:
012 002 011 001 011
012 112 022 011 001
注意可以使用兩種磚頭混合起來覆蓋,如2*4的牆可以這樣覆蓋:
0112
0012
給定N,要求計算2*N的牆壁的覆蓋方法。由於結果很大,所以只要求輸出最後4位。例如2*13的覆蓋方法為13465,只需輸出3465即可。如果答案少於4位,就直接輸出就可以,不用加0,如N=3,時輸出5。
解題思路
典型的遞推,表示出n等於各個數字時的狀態即可。
沒想到還是做了好幾分鐘的。
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 7 using namespace std; 8 9 int n, a[1000009][5]; 10 11 int main() 12 { 13 cin >> n; 14 a[1][1] = a[1][2] = 0; 15 a[1][3] = 1; 16 a[2][1] = a[2][2] = 1; 17 a[2][3] = 2; 18 for (int i = 3; i <= n; ++i) 19 { 20 a[i][1] = a[i - 1][2] + a[i - 2][3]; 21 a[i][2] = a[i - 1][1] + a[i - 2][3]; 22 a[i][3] = a[i - 1][3] + a[i - 1][2] + a[i - 1][1] + a[i - 2][3]; 23a[i][1] %= 10000; 24 a[i][2] %= 10000; 25 a[i][3] %= 10000; 26 } 27 cout << a[n][3]; 28 }