剑指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; } };