題目描述
三步問題。有個小孩正在上樓梯,樓梯有n階臺階,小孩一次可以上1階、2階或3階。實現一種方法,計算小孩有多少種上樓梯的方式。結果可能很大,你需要對結果模1000000007。
算法思路
這是一個很典型的動態規劃,和上樓梯的問題很類似。
慣例創建一個動態數組dp
,一維,i
表示階梯數爲i
,dp[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]