5.4打卡:剑指 offer两题:变态跳台阶/矩形覆盖

变态跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

分析

参考:https://www.nowcoder.com/questionTerminal/22243d016f6b47f2a6928b4313c85387?answerType=1&f=discussion
dp 就是可以由什么状态推导出最后的状态,斐波那契数列是由前两种状态,而这里就是由前 n - 1 种状态推导出

这里用同一个套路来分析一下

  • 若楼梯阶级 n = 3

    • 跳 3 步到 3:没有剩下步数没跳的,只有这样一种跳法
    • 跳 2 步到 3:剩下的是第一步没跳,起始跳到第一步只有一种
    • 跳 1 步到 3:剩下的是第二步没跳,起始跳到第二步有两种

    求得,n = 3 时,有 4 种跳法

  • 若楼梯阶级 n = 4

    • 跳 4 步到 4:没有剩下步数没跳的,只有这样一种跳法
    • 跳 3 步到 4:剩下的是第一步没跳,起始跳到第一步只有一种
    • 跳 2 步到 4:剩下的是第二步没跳,起始跳到第二步只有两种
    • 跳 1 步到 4:剩下的是第三步没跳,起始跳到第三步有四种

    求得,n = 4 时,有 8 种跳法

  • 若楼梯阶级 n = n

    • 跳 x 步到 n 有几种的和,跟前 n - 1 种状态有关

易知 f(n)=f(n-1)+f(n-2)+……f(1),f(n-1)=f(n-2)+……f(1),两式相减得f(n)=2f(n-1)

class Solution {
public:
    int jumpFloorII(int number) {
        return pow(2, number - 1);//2^(number-1)
    }
};

矩形覆盖

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

思路:
对于很多递归问题,我们都可以通过归纳总结来找出他们的规律:
当n=1时,way=1(横或竖)
当n=2时,way=2(全横或全竖)
当n=3时,way=3(全竖&横横竖&竖横横)
当n=4时,way=5(全竖&全横&竖横横竖&竖竖横横&横横竖竖)
当n=5时,way=8(全竖&竖横横竖竖&竖横横横横&竖竖横横竖&竖竖竖横横&横横竖竖竖&横横横横竖&横横竖横横)
.......
n=(n-1)+(n-2);
于是问题有转换成了之前的斐波那契数列问题了,依旧时同样的方法求解:

class Solution {
public:
    int rectCover(int number) {
        if(number <= 2) return number;
        int one = 1, two = 2, sum = 0;
        for (int i = 3; i <= number; i++) {
            sum = one + two;
            one = two;
            two = sum;
        }
        return sum;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章