剑指offer--变态跳台阶、矩形覆盖

开宗明义:本系列基于牛客网剑指offer,刷题小白,一天两道我快乐!旨在理解和交流,重在记录,望各位大牛指点!


牛客网-剑指offer



1、变态跳台阶

描述一只青蛙一次可以跳1级台阶,也可以跳2级,甚至可以跳n级台阶,求该青蛙跳上一个 n 级台阶总共有多少种跳法

思路推导动态规划的公式

  1. n台阶梯,第一步有 n n n 种跳法,1,2—n
  2. 跳一级,剩下 n − 1 n-1 n1 级,剩下的跳法是 f ( n − 1 ) f(n-1) f(n1)
  3. 再跳一级,剩下 n − 2 n-2 n2 级,剩下的跳法是 f ( n − 2 ) f(n-2) f(n2)
  4. 所以 f ( n ) = f ( n − 1 ) + f ( n − 2 ) + f ( n − 3 ) + . . . + f ( 2 ) + f ( 1 ) f(n)=f(n-1)+f(n-2)+f(n-3)+...+f(2)+f(1) f(n)=f(n1)+f(n2)+f(n3)+...+f(2)+f(1)
  5. 上述式子可得到: f ( n ) = 2 ∗ f ( n − 1 ) f(n)=2*f(n-1) f(n)=2f(n1)

测试代码:

class Solution {
public:
    int jumpFloorII(int number) {
 
        if (number == 0) {
            return 1;
        } 
        if (number == 1) {
            return 1;
        } 
        return 2 * jumpFloorII(number - 1);
    }
};

2、矩形覆盖

描述 2 ∗ 1 2*1 21 的小矩形横着或竖着去覆盖更大的矩形。请问用 n n n 2 ∗ 1 2*1 21 的小矩形无重叠地覆盖一个 2 ∗ n 2*n 2n 的大矩形,总共多少办法

思路数学归纳法,找规律

  1. n &lt; 1 n&lt;1 n<1 时,返回0
  2. n = 1 n=1 n=1 时,返回1
    在这里插入图片描述
  3. n = 2 n=2 n=2 时,返回2
    在这里插入图片描述
  4. n = 3 n=3 n=3
    在这里插入图片描述
  5. n = 4 n=4 n=4 时,…我们可以猜到 f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n)=f(n-1)+f(n-2) f(n)=f(n1)+f(n2)
  6. 将题目改成 1 ∗ 3 1*3 13 方块覆盖 3 ∗ n 、 1 ∗ 4 3*n、1*4 3n14 方块覆盖 4 ∗ n 4*n 4n
    相应的结论应该是
    (1) 1 ∗ 3 1 * 3 13 方块覆盖 3 ∗ n 3*n 3n 区域: f ( n ) = f ( n − 1 ) + f ( n − 3 ) , ( n &gt; 3 ) f(n) = f(n-1) + f(n - 3), (n &gt; 3) f(n)=f(n1)+f(n3)(n>3)
    (2) 1 ∗ 4 1 *4 14 方块覆盖 4 ∗ n 4*n 4n 区域: f ( n ) = f ( n − 1 ) + f ( n − 4 ) , ( n &gt; 4 ) f(n) = f(n-1) + f(n - 4),(n &gt; 4) f(n)=f(n1)+f(n4)(n>4)
    更一般的结论,如果用 1 ∗ m 1*m 1m 的方块覆盖 m ∗ n m*n mn 区域,递推关系式为 f ( n ) = f ( n − 1 ) + f ( n − m ) , ( n &gt; m ) f(n) = f(n-1) + f(n-m),(n &gt; m) f(n)=f(n1)+f(nm)(n>m)

测试代码:

class Solution {
public:
    int rectCover(int number) {
         if (number < 1) {
            return 0;
         }  
         if (number == 1 || number == 2) {
                return number;
         } 
         return rectCover(number-1) + rectCover(number-2);
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值