算法day38|509,70,746

动态规划

  • DP数组以及下标的含义
  • 递推公式
  • 初始化
  • 遍历顺序
  • 打印DP数组
五部曲

509. 斐波那契数

class Solution:
    def fib(self, n: int) -> int:
        #确定数组和下标的含义,运用一维数组
        if n == 0:
            return 0
        elif n == 1:
            return 1
        dp = [0]*(n+1)
        #初始化
        dp[0] = 0
        dp[1] = 1
        #遍历顺序,从前往后
        for i in range(2,n+1):
            dp[i] = dp[i-1]+dp[i-2]
        #打印dp数组
        return dp[-1]

很简单的动规入门题,但简单题使用来掌握方法论的,还是要有动规五部曲来分析。

代码随想录

视频:手把手带你入门动态规划 | 对应力扣(leetcode)题号:509.斐波那契数_哔哩哔哩_bilibili

二刷(未ac)

动态五部曲:

  • DP数组以及下标的含义
  • 递推公式
  • 初始化
  • 遍历顺序
  • 打印DP数组
var fib = function(n) {
    //定义dp[i],指的是第i个Fib的值为dp[i](我是谁)
    // 初始化(我是谁)
    // 递归逻辑(我从哪来,要到哪去)
    // 遍历顺序
    // 返回值
    let dp = new Array(n)
    dp[0] = 0
    dp[1] = 1
    for(let i = 2;i<n+1;i++){
        dp[i] = dp[i-1]+dp[i-2] 
    }
    return dp[n]  
};

70. 爬楼梯

class Solution:
    def climbStairs(self, n: int) -> int:
        if n == 1:
            return 1
        if n == 2:
            return 2
        dp = [0]*(n+1)
        #初始值
        dp[1] = 1
        dp[2] = 2
        
        #遍历顺序
        #dp数组及下标的含义
        for i in range(3,n+1):
            dp[i] = dp[i-1] + dp[i-2]
        return dp[-1]

本题大家先自己想一想, 之后会发现,和斐波那契数 有点关系。

主要是找规律,如何找到一阶台阶有1种,两阶台阶有2种

三阶台阶= 二阶+1阶

代码随想录

视频:带你学透动态规划-爬楼梯(对应力扣70.爬楼梯)| 动态规划经典入门题目_哔哩哔哩_bilibili

二刷:(未ac)

var climbStairs = function(n) {
    const dp = new Array(n)
    dp[0] = 1
    dp[1] = 1
    dp[2] = 2
    for(let i = 3;i<n+1;i++){
        dp[i] = dp[i-1]+dp[i-2]
    }
    return dp[n]
    
};

746. 使用最小花费爬楼梯

这道题目力扣改了题目描述了,现在的题目描述清晰很多,相当于明确说 第一步是不用花费的。

class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        #dp数组的含义及下标的含义,dp[i]代表的是所花费的最小值
        dp = [0]*(len(cost)+1)
        #初始值
        dp[0] = 0
        dp[1] = 0
        #遍历顺序,从前往后
        #终止条件,应该是到达顶楼停止,就是要比cost再多一个1
        for i in range(2,len(cost)+1):
        #递推公式
            dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
        #打印数组
        return dp[-1]

因为可以选择从0,开始或者从1开始。

假设cost = [10,15,20]

dp[0]开始的话,往上跳一个台阶的话,就是15,到达顶楼就是35

如果从dp[1]开始的话,往上跳一个台阶,就是20,到达顶楼就是20。你也可以选择跳两个台阶,直接15。

dp[0]开始的话,不用花费任何体力,,dp[1]开始的话,也不需要花费任何体力

初始值:dp[0] = 0,dp[1] = 0

递推公式:dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])

遍历顺序:从前往后遍历

dp数组含义:dp[i]代表的是到达i位置最小花费的数额

打印数组

更改题目描述之后,相当于是 文章中 「拓展」的解法

代码随想录

视频讲解:动态规划开更了!| LeetCode:746. 使用最小花费爬楼梯_哔哩哔哩_bilibili

二刷(未ac)

var minCostClimbingStairs = function(cost) {
    const dp = new Array(cost.length)
    dp[0] = 0
    dp[1] = 0
    for(let i = 2;i<cost.length+1;i++){
        dp[i] = Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
    }
    return dp[cost.length]
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值