剑指offer 矩形覆盖

题目描述

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
 
 
思路:
我们记n个2*1小矩形无重叠地覆盖一个2*n的大矩阵的方法数为f[n],
当n=0, f[0] = 0
当n=1, f[1] = 1
当n=2,我们可以选择横放或者竖放,当竖放时,一个2*1的小矩形刚好覆盖大矩形的一列,还剩一个2*(n-1)的矩形需要覆盖, 当横放时,接下来也只能横放。f[2] = f[2 - 1] + 1
当n=3,当竖放时,我们有f[3 - 1]种方法,当横放时,有f[3 - 2]种。
于是f[n] = f[n - 1] + f[n -2]
 
 1 class Solution {
 2 public:
 3     int rectCover(int number) {
 4         if (number <= 2) {
 5             return number;
 6         }
 7         vector<int> v(number + 1, 0);
 8         v[1] = 1;
 9         v[2] = 2;
10         for (int i = 3; i <= number; i++) {
11             v[i] = v[i - 1] + v[i - 2];
12         }
13         return v[number];
14     }
15 };

 

posted @ 2019-07-23 15:34  琴影  阅读(193)  评论(0编辑  收藏  举报