day28-数据结构力扣

今天开始学动态规划

其实动态规划这个部分一直都挺难的,一般包含:背包问题,打家劫舍,股票问题,子序列问题

对于动态规划问题,拆解为如下五步曲:

动态规划理论基础 | 动态规划 | 状态推导 | dp数组 | 代码随想录

  1. 确定dp数组(dp table)以及下标的含义

  2. 确定递推公式

  3. dp数组如何初始化

  4. 确定遍历顺序

  5. 举例推导dp数组

找问题的最好方式就是把dp数组打印出来,看看究竟是不是按照自己思路推导的

自己思考这三个问题:

  • 这道题目我举例推导状态转移公式了么?

  • 我打印dp数组的日志了么?

  • 打印出来了dp数组和我想的一样么?

509. 斐波那契数

题目链接 509. 斐波那契数 - 力扣(LeetCode)

思路

什么是斐波那契数?

斐波那契数是一个整数序列,其中每个数是前两个数的和。序列通常以 0 和 1 开始,后续数字依次为 1, 2, 3, 5, 8, 13, 21......数学上,斐波那契数列的递推关系为:

F(0) = 0

F(1) = 1

F(n) = F(n-1) + F(n-2) (n ≥ 2)

斐波那契数列具有许多有趣的数学特性:

  • 黄金分割比:随着 n 增大,F(n+1)/F(n) 趋近于黄金比例 (1 + √5)/2 ≈ 1.618。

  • 组合意义:斐波那契数表示用 1×1 和 1×2 的方块铺满 1×n 棋盘的方法数。

  • 矩阵表示:可通过矩阵幂运算高效计算斐波那契数。

动态规划思想

1.确定dp数组下标及其含义 dpi:第i个斐波那契值为dpi

2.递推公式 dpi=dpi-1+dpi-2

3.dp数组如何初始化 dp0=0 dp1=1

4.遍历顺序 从前往后遍历

5.打印dp数组

提交

python 复制代码
class Solution:
    def fib(self, n: int) -> int:
       
        # 排除 Corner Case
        if n == 0:
            return 0
        
        # 创建 dp table 
        dp = [0] * (n + 1)

        # 初始化 dp 数组
        dp[0] = 0
        dp[1] = 1

        # 遍历顺序: 由前向后。因为后面要用到前面的状态
        for i in range(2, n + 1):

            # 确定递归公式/状态转移公式
            dp[i] = dp[i - 1] + dp[i - 2]
        
        # 返回答案
        return dp[n]

70. 爬楼梯

题目链接70. 爬楼梯 - 力扣(LeetCode)

思路

1.确定dp数组下标及其含义 dpi:i个台阶需要dpi种方法

2.递推公式 dpi=dpi-1+dpi-2(我把n=1,2,3,4推了一下,然后看他们数值之间的关系)

3.dp数组如何初始化 dp0=0 dp1=1

4.遍历顺序 从前往后遍历

5.打印dp数组

那就是和上个题差不多,只是看起来形式不太一样

提交

但是这里需要注意,初始化应该多初始化一个dp2=2

因为他不符合我们的递推式,所以要单独写出来

然后遍历就往后移一位

python 复制代码
class Solution:
    def climbStairs(self, n: int) -> int:
        if n==0:
            return 0
        if n==1:
            return 1
        dp=[0]*(n+1)
        dp[0]=0
        dp[1]=1
        dp[2]=2

        for i in range(3,n+1):
            dp[i]=dp[i-1]+dp[i-2]

        return dp[n]

746. 使用最小花费爬楼梯

题目链接746. 使用最小花费爬楼梯 - 力扣(LeetCode)

思路

1.确定dp数组下标及其含义 dpi:到台阶i所需要的最小费用

2.递推公式

这里到i之后可能爬1阶,也可能2阶

dpi=min(dpi−1, dpi−2)+costi

含义:

  • 要到第 i 阶,只能从 i-1 爬 1 步 或 从 i-2 爬 2 步

  • 取两者中花费更小的,再加上当前台阶的费用 cost[i]

这个递推公式我没想出来

3.dp数组如何初始化 dp0=cost0 dp1=cost1

4.遍历顺序 从前往后遍历

5.打印dp数组

提交

python 复制代码
class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        n=len(cost)
        if n==0:
            return 0
        if n<=2:
            return min(cost)
        dp=[0]*(n+1)
        cost.append(0)

        dp[0]=cost[0]
        dp[1]=cost[1]
        for i in range(2,n+1):
            dp[i]=min(dp[i-1],dp[i-2])+cost[i]
        print(dp)
        return dp[n]
相关推荐
2401_872418785 小时前
算法入门:数据结构-堆
数据结构·算法
xwz小王子6 小时前
手术机器人登上Science Robotics:2毫米纤细手臂,从3厘米切口完成腰椎神经减压
算法·机器人
黎阳之光7 小时前
视频孪生智护供水生命线:黎阳之光赋能医疗与园区水务高质量升级
运维·物联网·算法·安全·数字孪生
Black蜡笔小新8 小时前
自动化AI算法训练服务器DLTM制造业AI质检工作站助力制造业实现AI智检
人工智能·算法·自动化
嵌入式小能手8 小时前
飞凌嵌入式ElfBoard-进程间的通信之命名管道
linux·服务器·算法
啦哈拉哈8 小时前
Leetcode题解记录-hot100(81-100)
算法·leetcode·职场和发展
csdn_aspnet8 小时前
Java 霍尔分区算法(Hoare‘s Partition Algorithm)
java·开发语言·算法
诸葛务农9 小时前
道路行驶条件下电动汽车永磁电机的有效使用寿命及永磁体的失效和回收再利用(下)
java·开发语言·算法
snow@li9 小时前
AI:理解 大数据、算法、算力、电力、生成式AI、token 之间的关系
大数据·人工智能·算法
小智老师PMP9 小时前
零基础能不能考PMP?零基础专属学习路径+全套扶持体系
学习·算法·职场和发展·软件工程·求职招聘·敏捷流程