剑指offer JZ-10

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
 
比如n=3时,2*3的矩形块有3种覆盖方法:
思路:
  定义dp[k]为覆盖2*k矩形的方案数
  很容易发现,覆盖2*k的矩形可由2*(k-1)的矩形添加一个竖放的2*1的矩形得到,也可以有2*(k-2)的矩形添加两个横放的2*1矩形得到
  故:dp[k] = dp[k-1] + dp[k-2]
依然是斐波那契问题
class Solution {
public:
    int rectCover(int number) {
        if(number == 0) return 0;
        if(number == 1) return 1;
        if(number == 2) return 2;
        int pre_1 = 2;
        int pre_2 = 1;
        for(int i=3;i<=number;i++)
        {
            int now = pre_1 + pre_2;
            pre_2 = pre_1;
            pre_1 = now;
        }
        return pre_1;
    }
};
View Code

 

posted @ 2021-01-03 23:38  声声醉如兰  阅读(47)  评论(0编辑  收藏  举报