【力扣】面試08.01:三步問題 | 動態規劃

題目描述

三步問題。有個小孩正在上樓梯,樓梯有n階臺階,小孩一次可以上1階、2階或3階。實現一種方法,計算小孩有多少種上樓梯的方式。結果可能很大,你需要對結果模1000000007。

來源:力扣(LeetCode)

算法思路

這是一個很典型的動態規劃,和上樓梯的問題很類似。

慣例創建一個動態數組dp,一維,i表示階梯數爲idp[i]保存上樓方式的數量。

這裏假設樓梯數爲i,到達i有多少種方法?
因爲我們可以一步上一階或者兩階或者三階,所以我們可以先到達i-1階,然後再向上一階;或是到達i-2階,然後向上兩階;再或者到i-3階,然後向上三階。

顯然到達i階的方法數量就是到達i-1階與i-2階與i-3階數量的和。
即:dp[i]=dp[i-1]+dp[i-2]+dp[i-3]

初始化dp數組:
dp=[1,1,2,4]

完整算法

class Solution:
    def waysToStep(self, n: int) -> int:
        dp=[1,1,2,4]+[0]*(n-3)
        for i in range(3,n+1):
            dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%(10**9+7)
        return dp[n]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章