一魚多吃 用費式數列的DP模型來解 爬樓梯Climbing Stairs_Leetcode #70

小松鼠-avatar-img
發佈於演算法題目解析 個房間
更新於 發佈於 閱讀時間約 5 分鐘
raw-image

這題乍看之下是新題目,但仔細一想,其實只是前面介紹過的費式數列的小變形而已,解題思想基本不變。


題目敘述

原文題目可以在這裡看到

題目說每次可以爬一階樓梯或兩階樓梯,問爬到n階的方法數是多少。

對應的詳解影片,搭配服用,效果更佳。

範例輸入輸出如下:

Example 1:

Input: n = 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps

Example 2:

Input: n = 3
Output: 3
Explanation: There are three ways to climb to the top.
1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 step

複習再複習,Dynamic programming的解題框架可分為三大步驟

1. 定義DP狀態 [我在哪裡]

  1. 推導DP狀態轉移關係式(通則) [我從哪裡來] => [答案從哪裡推導而來]

3. 釐清DP初始狀態(也可以說是遞迴的終止條件) [第一步怎麼走,怎麼出發的]


這裡我們走過一遍DP解題框架,可分為三大步驟

1. 定義DP狀態 
[我在哪裡]

這題也滿直覺的,就令DP[n]為爬n階樓梯的方法數。


2. 定義DP狀態轉移關係式(通則)
[我從哪裡來] => [答案從哪裡推導而來]

題目說每次可以爬一階樓梯或兩階樓梯,也就是說

假如當下這層是第n階樓梯,那麼我們有兩種方式可以到達這裡:

一種是先到n-1階,接著再爬一階樓梯,那麼我們就到了第n階。

另一種是先到n-2階,接著再爬兩階樓梯,那麼我們就到了第n階。

用遞迴關係式表示就是

DP[n] = DP[n-1]+ DP[n-2]

其中DP[n-1]這項代表含先到n-1階再爬一階的意思, 而

DP[n-2]這項代表含先到n-2階再爬兩階的意思。

如下圖所示

raw-image

3. 釐清初始狀態(終止條件)
[第一步怎麼走,怎麼出發的]

比較敏銳的同學,可以發現,這條遞迴式和大家熟知的費式數列相同。

對的,就是f(n) = f(n-1) + f(n-2)的形式。

唯一的小差別初始條件不同而已。

爬0階樓梯有幾種方式?只有一種,就是什麼都沒做,沒有爬任何一階階梯。

DP[0] = 1

爬1階樓梯有幾種方式?只有一種,就是從0階往上爬一階就到第1階樓梯。

DP[1] = 1

更高層的2階, 3階…等還需要初始化嗎? 不用了,因為我們已經可以從遞回式DP[n] = DP[n-1] + DP[n-2] 計算出來。


到這裡,已經填滿解題框架的所有內容,接著我們把它轉成程式碼,

這裡以Python作為示範


程式碼 Top - down DP

class Solution:
 def climbStairs(self, n: int) -> int:
  
  # DP table
  # key: floor
  # value: method count to climb

  ## Base case
  table = {
     0: 1,
     1: 1
    }

  def dp( n: int) -> int:

   # look-up table
   if n in table:
    return table[n]

   ## General case
   table[n] = dp(n-1) + dp(n-2)
   return table[n]
   
  # ----------------------------------
  return dp(n)

程式碼 Bottom-up DP

class Solution:

 def climbStairs(self, n: int) -> int:

  # DP table
  # key: floor
  # value: method count to climb
  table = [1 for _ in range(n+1)]
  
  ## General case
  for i in range(2, n+1):
   table[i] = table[i-1] + table[i-2]
  
  return table[n]

複雜度分析

時間複雜度:O(n)

從n階樓梯降階到1階,每階樓梯的方法數可以在O(1)時間內計算完成。

空間複雜度:O(n)

DP table和遞迴呼叫深度皆為O(n)


學完這題的同學,記得去複習 DP動態規劃 深入淺出 以Fibonacci Number 費式數列 為例 這題喔,其實兩者背後的DP框架和觀念都是相通的喔!


下一篇: 活用DP: 泰伯納西數列的第n項 Leetcode #1137_精選75題


Reference:

[1] DP動態規劃 深入淺出 以Fibonacci Number 費式數列 為例|方格子 vocus

avatar-img
91會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給我們一個輸入陣列candidates,和一個目標值 target 問我們,從canditdates裡面重複挑選,可以湊出總和為target目標值的組合數有幾種? 在此,我們將使用找零錢II的DP模型和化簡的技巧來解題。
在經過比較簡單的入門題(Coin Change)之後, 來看進階一點的DP題目Coin Change II 整零錢的全部方法數。 不免俗,再次強調DP的解題框架,鞏固知識點。
深入淺出,從最基本的 費式數列, 一探動態規劃的奧秘與精隨。
Coin Change + DP 策略_Leetcode 面試題 上機考 題目 詳細解說
題目會給我們一個輸入陣列candidates,和一個目標值 target 問我們,從canditdates裡面重複挑選,可以湊出總和為target目標值的組合數有幾種? 在此,我們將使用找零錢II的DP模型和化簡的技巧來解題。
在經過比較簡單的入門題(Coin Change)之後, 來看進階一點的DP題目Coin Change II 整零錢的全部方法數。 不免俗,再次強調DP的解題框架,鞏固知識點。
深入淺出,從最基本的 費式數列, 一探動態規劃的奧秘與精隨。
Coin Change + DP 策略_Leetcode 面試題 上機考 題目 詳細解說
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
關於復健,就是越去做就會越順,所以我從不停止自己去做,即便想偷懶心裡會抗拒,我都還是硬著頭皮去做。 所以我決定再次爬樓梯上去,因爲總是要上樓的,現在不做以後還是得做,感覺自己像新生兒一樣都要學都要做,循序漸進的做,先學會爬才能學走,別想ㄧ步登天。爬樓梯有
Thumbnail
一名棋手的成長過程就像爬樓梯一樣,爬到第一階代表著學會了最基本的吃子技巧,往後的每一階層都代表著學到了某一項下棋的技術抑或是心靈上的提升,到了最高處會是甚麼呢?或許沒人可以解答得出來。
Thumbnail
扣上鉤環 戴上安全帽 坐在攀樹座帶 一手拉著胸繩 一腳踩著輔助繩圈 靠著攀樹繩手腳推進 小彩虹本來對這麼多道具的爬樹法 不太有興趣 幾番鼓勵後 她爬了第一次 接著 就再要求第二次 第三次 …
Thumbnail
在看完了咚咚的思辨學堂老師的機率的排列組合 – 在數學上要多加留意題目裡的「換句話說」後。 那題代數轉塗色問題我是真的沒想到。(學會了!😆😆😆) 我決定我也來出幾題。 難度稍高? 邀請大神一同作答激盪出不同的解法。 (一)5對兄妹共舞,若每一兄均不與其妹為舞伴,則共有      
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
關於復健,就是越去做就會越順,所以我從不停止自己去做,即便想偷懶心裡會抗拒,我都還是硬著頭皮去做。 所以我決定再次爬樓梯上去,因爲總是要上樓的,現在不做以後還是得做,感覺自己像新生兒一樣都要學都要做,循序漸進的做,先學會爬才能學走,別想ㄧ步登天。爬樓梯有
Thumbnail
一名棋手的成長過程就像爬樓梯一樣,爬到第一階代表著學會了最基本的吃子技巧,往後的每一階層都代表著學到了某一項下棋的技術抑或是心靈上的提升,到了最高處會是甚麼呢?或許沒人可以解答得出來。
Thumbnail
扣上鉤環 戴上安全帽 坐在攀樹座帶 一手拉著胸繩 一腳踩著輔助繩圈 靠著攀樹繩手腳推進 小彩虹本來對這麼多道具的爬樹法 不太有興趣 幾番鼓勵後 她爬了第一次 接著 就再要求第二次 第三次 …
Thumbnail
在看完了咚咚的思辨學堂老師的機率的排列組合 – 在數學上要多加留意題目裡的「換句話說」後。 那題代數轉塗色問題我是真的沒想到。(學會了!😆😆😆) 我決定我也來出幾題。 難度稍高? 邀請大神一同作答激盪出不同的解法。 (一)5對兄妹共舞,若每一兄均不與其妹為舞伴,則共有      
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。