[Leetcode 746] Dynamic Programming - Min Cost Climbing Stairs(使用最小花费爬楼梯)

一开始我的做法是用一个二维数组来做dp,但后来发现,其实每次只需要保存上一步dp的两个值即可,于是对dp方法又做了改进.

第一种解法

首先说一下用二维数组做dp的方法:

dp数组有两行:

  • 第一行表示走当前阶梯,如果走了当前阶梯,则第n-1个阶梯可走可不走,取走与不走的最小值加上当前第n步的花费,即为走当前步的最小值,则最低花费为
    d p [ 0 ] [ n ] = m i n ( d p [ 0 ] [ n − 1 ] , d p [ 1 ] [ n − 1 ] ) + c o s t [ n ] dp[0][n] = min(dp[0][n-1],dp[1][n-1]) + cost[n] dp[0][n]=min(dp[0][n1],dp[1][n1])+cost[n]

  • 第二行表示不走当前阶梯:如果不走当前阶梯,则第n-1个阶梯是必须走的,否则无法继续走下去,最低花费的dp公式为:
    d p [ 1 ] [ n ] = d p [ 0 ] [ n − 1 ] dp[1][n] = dp[0][n-1] dp[1][n]=dp[0][n1]

最终比较dp数组中每一维的最后一个元素的大小,较小的即为最终花费,因为最后一步其实可走可不走,最终cost为:

m i n _ c o s t = m i n ( d p [ 0 ] [ l e n ( c o s t ) ] , d p [ 1 ] [ c o s t ] ) min\_cost = min(dp[0][len(cost)], dp[1][cost]) min_cost=min(dp[0][len(cost)],dp[1][cost])

import numpy as np

class Solution(object):
    def minCostClimbingStairs(self, cost):
        """
        :type cost: List[int]
        :rtype: int
        """
       
        length = len(cost)
        dp = np.zeros((2, length))
        
        
        dp[0][1] = cost[1]
        dp[1][1] = cost[0]
        
        for n in range(2, length):
            
            dp[0][n] = min(dp[0][n-1], dp[1][n-1]) + cost[n]
            dp[1][n] = dp[0][n-1]
            
        return int(min(dp[0][length-1], dp[1][length-1]))
        
        

优化的解法

而其实我们观察上面的dp过程,可以发现,当前阶梯的最低花费值其实是可以由两个值确定:经过前一个阶梯的最低花费和不经过前一个阶梯的最低花费:

  • 走过当前阶梯的最低花费由走过上一个阶梯的最低花费和不走过上一个阶梯的最低花费的最小值加上当前阶梯的花费得到,dp公式为:
    t m p _ h a v e _ c u r = m i n ( h a v e _ c u r , h a v e _ n o _ c u r ) + c o s t [ n ] tmp\_have\_cur = min(have\_cur, have\_no\_cur) + cost[n] tmp_have_cur=min(have_cur,have_no_cur)+cost[n]
  • 不走过当前阶梯的最低花费由走过前一个阶梯的最低花费决定,dp公式为:
    t m p _ h a v e _ n o _ c u r = h a v e _ c u r tmp\_have\_no\_cur = have\_cur tmp_have_no_cur=have_cur

初始化是从是否经过第二个阶梯开始的,因为题目给了cost数组必定会大于等于2,所以我们初始化直接从是否经过第二个台阶即可。

具体代码如下:


import numpy as np

class Solution(object):
    def minCostClimbingStairs(self, cost):
        """
        :type cost: List[int]
        :rtype: int
        """
      
        have_cur = cost[1]
        have_no_cur = cost[0]
        cost_len = len(cost)
        
        for n in range(2, cost_len):
            
            tmp_have_cur = min(have_cur, have_no_cur) + cost[n]
            tmp_have_no_cur = have_cur
            
            have_cur = tmp_have_cur
            have_no_cur = tmp_have_no_cur
            
        return min(have_cur, have_no_cur)
        

    
solution = Solution()
print(solution.minCostClimbingStairs([1, 100, 1, 1, 1, 100, 1, 1, 100, 1]))




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值