矩形覆盖

思想:

分治法(递归法):

分治法,分而治之。就是将原问题划分为n个规模较小,结构与原问题类似的小问题进行处理,递归地解决这些问题,然后再合并求解的过程。

  分治法在解决的流程上分为三个步骤:

  1.分解:将原问题划分为n个规模较小,结构与原问题类似的小问题。

  2.解决:若子问题规模小,足以处理,则求解,否则继续递归处理。

  3.合并:将子问题的解,合并成为原问题的解。

第一步如果采用竖方向放:

那么问题就变成了用 n-1 个 2x1 的小矩形去覆盖 2x(n-1) 的大矩形。

第一步如果采用横方向放:

那么问题就变成了用 n-2 个2x1 的小矩形去覆盖 2x(n-1) 的大矩形。

 

递归公式为:Fn = Fn-1 + Fn-2

递归法太耗空间资源,可以只保存前两项的结果就可以了。

python

 

 1 # -*- coding:utf-8 -*-
 2 class Solution:
 3     def rectCover(self, number):
 4         # write code here
 5         res = [0,1,2]
 6         if number <= 2:
 7             return res[number]
 8         while number!=len(res)-1:
 9             res.append(res[-1]+res[-2])
10         return res[-1]

 

c++

用一个双端队列来保持前两项

 1 class Solution {
 2 public:
 3     int rectCover(int number) {
 4         if(number<=0) return 0;
 5         else if(number==1) return 1;
 6         else if(number==2) return 2;
 7         deque<int> res;
 8         res.push_back(1);
 9         res.push_back(2);
10         for(int i=0;i<number-2;i++){
11             res.push_back(res.front()+res.back());
12             res.pop_front();
13         }
14         return res.back();
15     }
16 };

 

posted @ 2019-07-04 14:33  Austin_anheqiao  阅读(164)  评论(0编辑  收藏  举报