题目
给你一个整数数组 cost
,其中 cost[i]
是从楼梯第 i
个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0
或下标为 1
的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
思路
这道题目可以使用动态规划来求解,动态规划的核心思想是通过记录历史的最优解来推导出全局的最优解。
我们定义一个动态规划数组 dp
,dp[i]
表示达到第 i
阶时所需的最小花费。
-
初始状态:
dp[0]
和dp[1]
分别等于cost[0]
和cost[1]
,因为到达第 0 阶和第 1 阶的最小花费就是站在这些台阶上的花费。
-
状态转移方程:
- 对于任意的第
i
阶台阶,你可以从第i-1
阶爬 1 阶到达,或者从第i-2
阶爬 2 阶到达。因此,状态转移方程为: dp[i]=min(dp[i−1],dp[i−2])+cost[i]dp[i] = \min(dp[i-1], dp[i-2]) + cost[i]dp[i]=min(dp[i−1],dp[i−2])+cost[i] - 到达第
i
阶的最小花费是从前两个台阶的最小花费加上当前台阶的花费。
- 对于任意的第
-
终止状态:
- 由于我们可以从
0
或1
开始,因此到达楼顶len(cost)
的花费是dp[len(cost)]
,该楼顶不需要任何花费,意味着最终返回的结果是dp[len(cost)]
。
- 由于我们可以从
代码
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
cost.append(0) # 在列表末尾追加一个0,表示可以从最后一步离开
for i in range(2, len(cost)): # 从第2步开始循环
cost[i] = min(cost[i-1], cost[i-2]) + cost[i] # 动态规划状态转移方程
return cost[len(cost) - 1] # 最后返回cost列表的最后一个值,它代表到达顶层的最小花费