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

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

比如n=3时,2*3的矩形块有3种覆盖方法:

分析:我们对算法模型做些简化,我们知道,只可以放置两种类型的小矩形,一种是竖着放的2*1矩形,另一种是两块横着放的2*1矩形上下放置形成的2*2正方形,而题目要放置的是2*n的大矩形。

要放置的是2*n的大矩形,①我们要么竖着放的2*1矩形,②要么横着放两块(为什么不竖着放呢)的2*1矩形上下放置形成的2*2正方形。只有这两种放法。

注意:为什么不计算两个竖起来放的2*1矩形形成的2*2正方形呢?

因为已经计算过了。手动滑稽~~两个竖起来放的2*1矩形形成的2*2正方形我们在①种已经计算过了。

简化算法:一条线段,每次要么画1cm。要么每次画2cm。问:画n  cm长的线段有多少种方法。

道理同青蛙跳台阶。实际就是一个斐波那契数列。

代码:

public class Solution {
    public int RectCover(int target) {
            if(target<=2){
                return target;
            }
            int a=1;
            int b=2;
        for(int i=3;i<=target;i++){
            b=a+b;
            a=b-a;
        }
        return b;
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值