https://leetcode-cn.com/problems/min-cost-climbing-stairs
class Solution:
def minCostClimbingStairs(self, cost):
"""
:type cost: List[int]
:rtype: int
"""
dp = [0]*(len(cost)+1)
for i in range(2, len(cost)+1):
dp[i] = min(dp[i-2]+cost[i-2], dp[i-1]+cost[i-1])
return dp[-1]
看到一种效率很高的解法:
class Solution:
def minCostClimbingStairs(self, cost):
"""
:type cost: List[int]
:rtype: int
"""
f0, f1 = 0, 0
for num in reversed(cost):
f0, f1 = num + min(f0, f1), f0
return min(f0, f1)
其实就是从后往前做DP,最后取dp0或dp1,他们分别代表从第一个阶梯开始爬和从第二个阶梯开始爬的最下花费,详细思路代码如下:
class Solution:
def minCostClimbingStairs(self, cost):
"""
:type cost: List[int]
:rtype: int
"""
dp = [0]*(len(cost)+2)
for i in range(len(cost)-1, -1, -1):
dp[i] = cost[i] + min(dp[i+1], dp[i+2])
return min(dp[0:2])