leetcode动态规划刷题之楼梯

我这里写两道题,一题是单纯的爬楼梯,数总数,另一道是最小消耗爬楼梯。
在这里插入图片描述
思路过程: 我借鉴了一位大佬的思路,要爬第n阶,那么有第n-1和第n-2这两种到达方法,注意看他给的实例: 容易得出 f(n)=f(n-1)+f(n-2)
先放上我写的代码:

  class Solution:
    def climbStairs(self, n):
        arr=[-1]*(n+1);arr[1]=2;arr[0]=1
       
        for i in range(2,n+1):
            arr[i]=arr[i-1]+arr[i-2]
        return arr[n-1]

在这里插入图片描述
循环思路构思: 我们算的是到达第n阶,那么为了给他赋值,i在数组要取到n+1;arr数组长度也取到n+1
第二点,楼梯的n题目明确给定正整数,也就是n>=1

总的来说,这题比较简单,没有下面这题有深度。。

在这里插入图片描述

思路过程:最小花费这应该是迷你版的打家劫舍;;照葫芦画瓢,递归和记忆化存储两种都过了。。代码我放在文最下面
在这里插入图片描述
递归这里超时了,过了85%的数据
在这里插入图片描述
我写这种决策题还是先画图:
在这里插入图片描述
画图分析:容易发现,画星星的地方都是重复的子问题,另外可以看到找5的最小消耗就要找4的最小消耗或者3的最小消耗,根据这点来写循环

循环分析: 路线在当前决策上一阶或两阶,所以,范围为(i,i+2);递归每次加1;所以,dp(cost,j+1)

记忆化写法:

class Solution:
    def minCostClimbingStairs(self, cost):
       i=0
       memo=[-1]*len(cost)
       def dp(cost,i): 
         if i>=len(cost)-1:
            return 0
         if memo[i]!=-1:
             return memo[i]
         res=1000000
         for j in range(i,i+2):
            res=min(res,cost[j]+dp(cost,j+1))
            memo[i]=res
         return res   
       return dp(cost,0)

循环分析: 之前写过了,吧值存到memo数组中,然后打表;写的时候容易犯错在memo[i]=res;而不是memo[j]=res;

递归代码:

class Solution:
def minCostClimbingStairs(self, cost):
   i=0
   def dp(cost,i): 
     if i>=len(cost)-1:
        return 0
     res=1000000
     for j in range(i,i+2):
        res=min(res,cost[j]+dp(cost,j+1))
     return res   
   return dp(cost,0)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ECHO::

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值