算法系列——矩形覆盖(剑指offer)

来源:互联网 发布:淘宝直播难申请成功 编辑:程序博客网 时间:2024/06/11 22:25

题目描述

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

解题思路

递归法

本质是一个菲波那切数列,将n个2*1的小矩形无重叠地覆盖一个2*n的大矩形的方法数记为f(n)。以n=3,为例,当竖着放的时候,右边还剩下2*2的区域,这种情况下的覆盖方法记为f(2),当横着放在左上角的时候,左下角必须横着放一个2*1的小矩形,因此右边还剩下 2*1,可以发现 f(3)=f(2)+f(1), 那么递推关系为

f(n)=f(n-1)+f(n-2)(n>2,f(0)=0,f(1)=1,f(2)=2)

动态规划法

将i个2*1的小矩形无重叠地覆盖一个2*n的大矩形的方法数记为dp[i]
状态转移方程为:

dp[i]=dp[i-1]+dp[i-2] (3<=i<=n)

程序实现

递归法

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

动态规划法

public class Solution {    public int RectCover(int target) {        if(target<=0)            return 0;        if(target==1||target==2)            return target;        //处理target>=3        int []dp=new int[target+1];        //初始化        dp[1]=1;        dp[2]=2;        for(int i=3;i<=target;i++)            dp[i]=dp[i-1]+dp[i-2];        return dp[target];    }}