【力扣】面试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]

你可能感兴趣的:(力扣日记)