洛谷[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 }

浙公网安备 33010602011771号