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

 

posted @ 2021-09-19 19:37  Christopher_Yan()  阅读(153)  评论(0)    收藏  举报