爬樓梯-動態規劃

假設你正在爬樓梯.須要n階你才能到達.app

每次你能夠爬1或者2個臺階.你有多少種不一樣的方法能夠爬到樓頂呢?spa

注意: 給定n是一個正整數.code

示例1:blog

輸入: 2
輸出: 2
解釋: 有兩種方法能夠爬到樓頂。
1.  1 階 + 12.  2

示例2:class

輸入: 3
輸出: 3
解釋: 有三種方法能夠爬到樓頂。
1.  1 階 + 1 階 + 12.  1 階 + 23.  2 階 + 1

 

解法一: 動態規劃cli

先不講思想之類的,先看n值不斷變化的時候,有什麼規律嗎?,用result記錄多種可能性方法

  1. 當n = 0 ,result = 0;
  2. 當n = 1, result = 1;
  3. 當n = 2, result = 2;
  4. 當n = 3, result = 3;
  5. 當n = 4, result = 5……

經過上面咱們發現規律以下:im

思想margin

下面咱們談思想,不難發現,這個問題能夠被分解爲一些包含最優子結構的子問題,即它的最優解能夠從其子問題的最優解來有效的構建,能夠用動態規劃來解決這一問題.img

第 i 階能夠由如下兩種方法獲得:

  1. 在第(i - 1)階後向上爬一階
  2. 在第(i - 2)階後向上爬兩階

因此到達第 i 階的方法總數就是第 (i - 1) 和第 (i - 2)階的方法數之和.

令dp[ i ] 表示能到達第 i 階的方法總數:

dp[ i ] = dp[i - 1] + dp[i - 2]

代碼

func climbStairs(_ n: Int) -> Int {
        guard n > 0 else {return 0}
    if n == 1 {
        return 1
    }
    var dp: [Int] = [Int]()
    dp.append(0) //第一個元素,當n = 0,不存在方式爬到樓上
    dp.append(1) //第2個元素,當n = 1, 1種方式
    dp.append(2) //第3個元素,當n = 2, 2種方式
    for i in 3..<n + 1 {
        dp.append(dp[i - 1] + dp[i - 2]) //用append不如用=賦值
    }
    return dp[n]
    }

結果

上面就是動態規劃的思想作,之後有其餘思想作此題目,會更新最新的思想和代碼(因本階段專一動態規劃解法).

相關文章
相關標籤/搜索