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;
    }
};

 

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