矩形覆盖--递归实现

来源:互联网 发布:通达信软件的使用方法 编辑:程序博客网 时间:2024/06/08 00:28

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

这个题的比较难以下手,首先找一下规律,n=1,只有一种,n=2,是一个正方形,可以讲小矩形横着放或者竖着放:
这里写图片描述

当n=3,假如第三个小矩形恰好能够竖直放下,这个时候,就相当于只考虑第一个和第二个小矩形怎么放,也就是怎么用小矩形去填充一个正方形,就回到了上一步,n=2时的方法,这个时候的方法数恰好就应该为f(2).
假如第三个小矩形恰好能够横着放下,这个时候第二个矩形也必定是横着放的,那么第二和第三个小矩形就确定了,只需要考虑第一个小矩形的摆放方法,也就是f(1).
那么f(3)=f(2)+f(1)。这个时候我们还不能完全看出规律。假如n很大的时候,我们只考虑n,n-1,n-2,这三个小矩形的摆放方式。如下图所示:
这里写图片描述

按照n=3 时候的思考,假如摆放第n个小矩形只能竖直摆放,那么恰好是下图这种情况:
这里写图片描述
这时,最后一个小矩形是固定的,只要考虑前面n-1个小矩形的摆放方法,就是f(n)。

接着,假如最后一个小矩形只能横着摆放,也就是下图所示:
这里写图片描述

这个时候,最后两个小矩形的位置固定的,就只需要考虑前n-2个小矩形的摆放方式,也就是f(2).

综上分析:
f(n) = f(n-1) + f(n-2). (n >= 3)
f(2) = 2;
f(1) = 1
f(0) = 0;
代码如下:

public class Solution {    public int RectCover(int target) {        if(target <= 0){            return 0;        }        if(target == 1){            return 1;        }        if(target == 2){            return 2;        }        return RectCover(target - 1) + RectCover(target -2 );    }}
0 0