剑指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 };
越努力,越幸运