📜  爬楼梯到达地板顶部的最低成本(1)

📅  最后修改于: 2023-12-03 15:40:49.240000             🧑  作者: Mango

爬楼梯到达地板顶部的最低成本

问题描述

在楼梯上有一些标有数字的阶梯,第 i 个阶梯上写着非负整数 cost[i]。一开始你站在第一个阶梯上,按规则要求,你需要跳到最后一个阶梯上。每次你可以跳两个阶梯或者一步一个阶梯。你对跳到每一个阶梯上的花费都有了解,其中 cost[i] 表示你跳到第 i 个阶梯要花费的代价。你可以选择从第一个阶梯开始,也可以选择从第二个阶梯开始。求出最小的花费是多少。

实现思路

我们可以使用动态规划的思想来解决这个问题。设 dp[i] 表示到达第 i 层楼梯的最小成本,则有以下状态转移方程:

$$ dp[i] = \min(dp[i-1], dp[i-2]) + cost[i-1] $$

其中,cost[i-1] 表示到达第 i 层楼梯需要花费的代价,注意这里 cost 数组的下标从0开始,而 dp 数组的下标从1开始。

同时,因为可以选择从第一层楼梯开始跳或者从第二层楼梯开始跳,所以最终答案为 dp[n] 和 dp[n+1] 中的较小值,其中 n 表示楼梯总数。

代码实现
def minCostClimbingStairs(cost: List[int]) -> int:
    n = len(cost)
    dp = [0] * (n+1)
    for i in range(2, n+1):
        dp[i] = min(dp[i-1], dp[i-2]) + cost[i-1]
    return min(dp[n], dp[n+1])
复杂度分析
  • 时间复杂度:$O(n)$,其中 n 表示楼梯总数。
  • 空间复杂度:$O(n)$,需要额外的数组 dp 存储状态。