1. 程式人生 > >【劍指offer{7-10}】斐波那契數列、跳臺階、變態跳臺階、矩形覆蓋

【劍指offer{7-10}】斐波那契數列、跳臺階、變態跳臺階、矩形覆蓋

斐波那契數列、跳臺階、變態跳臺階、矩形覆蓋

注:思路均是動態規劃,用中間陣列dp存放計算值,如果用遞迴耗費空間太大。

斐波那契數列

題目描述

  • 大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。
    n<=39

C++程式碼

class Solution {
public:
    int Fibonacci(int n) 
    {
        int *dp = (int *)malloc(sizeof(int)*(n+1));
        dp[0] = 0;
        dp[1] = 1;
        for(int i = 2;i<=n;i++)
        {
            dp[i] = dp[i-1]+dp[i-2];
        }
        return dp[n];
    }
};

跳臺階

題目描述

  • 一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。

C++程式碼

class Solution {
public:
    int jumpFloor(int number) 
    {
        int *dp = (int *)malloc(sizeof(int)*(number+1));
        dp[0] = 0;
        dp[1] = 1;
        dp[2] = 2;
        for(int i = 3;i<=number;i++)
        {
            dp[i] = dp[i-1]+dp[i-2];
        }
        return dp[number];
    }
};

變態跳臺階

題目描述

  • 一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

C++程式碼

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

矩形覆蓋

題目描述

  • 我們可以用21的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2
    1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?

C++程式碼

class Solution {
public:
    int rectCover(int number) 
    {
        int *dp = (int *)malloc(sizeof(int)*(number+1));
        dp[0] = 0;
        dp[1] = 1;
        dp[2] = 2;
        for(int i = 3;i<=number;i++)
        {
            dp[i] = dp[i-1]+dp[i-2];
        }
        return dp[number];
    }
};