1. 程式人生 > 其它 >洛谷[P1990] 覆蓋牆壁

洛谷[P1990] 覆蓋牆壁

題目描述

你有一個長為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]; 23
a[i][1] %= 10000; 24 a[i][2] %= 10000; 25 a[i][3] %= 10000; 26 } 27 cout << a[n][3]; 28 }