算法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

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

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

你可能感兴趣的:(算法,算法,动态规划,leetcode)