算法打卡day33|动态规划篇01|动态规划理论基础| Leetcode 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

目录

动态规划理论

定义

动态规划的解题步骤

算法题

Leetcode 509. 斐波那契数

 个人思路

解法

动态规划

 Leetcode  70. 爬楼梯

个人思路

解法

动态规划

 Leetcode  746. 使用最小花费爬楼梯

个人思路

解法

动态规划


动态规划理论

定义

动态规划(Dynamic Programming,简称DP),主要用于解决多阶段决策问题。它的核心思想是将一个复杂的多阶段问题转化为一系列相对简单的单阶段问题,然后逐一求解这些单阶段问题,最后将这些单阶段问题的解合并,得到原始问题的解

动态规划中每一个状态一定是由上一个状态推导出来的这一点就区别于贪心,贪心没有状态推导,而是从局部直接选最优的

动态规划的主要理论基础包括最优性原理、无后效性和有重叠子问题三个性质:

  • 最优性原理:如果问题的最优解所包含的子问题的解也是最优的,称该问题具有最优子结构,满足最优性原理。

  • 无后效性:即某个阶段的状态一旦确定,就不受这个状态以后决策的影响。

  • 有重叠子问题:即子问题之间是不独立的,一个子问题在下一个阶段决策中可能多次使用到。

在实际应用中,动态规划已被广泛应用于各类问题,如路径优化、资源分配、生产调度、库存管理和投资组合等优化问题。例如,在路径优化问题中,可以将路径划分为多个阶段,每个阶段的状态表示为路径的一部分,决策表示为选择哪条路径,然后通过动态规划算法求出最优路径。

动态规划的解题步骤

这里推荐卡哥总结的动规五步曲:

状态转移公式(递推公式)是很重要,但动规不仅仅只有递推公式。

对于动态规划问题,将拆解为如下五步曲,将五步都搞清楚,才能是把动态规划真的掌握了

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

  2. 确定递推公式

  3. dp数组如何初始化

  4. 确定遍历顺序

  5. 举例推导dp数组

这里之所以要先确定递推公式,然后在考虑初始化,是因为一些情况是递推公式决定了dp数组要如何初始化其实 确定递推公式 仅仅是解题里的一步而已!搞不清楚dp数组应该如何初始化,或者正确的遍历顺序,以至于记形忘神。

写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果对于结果的处置,这就要说到非常重要的的debug;把dp数组打印出来,看看究竟是不是按照正确思路推导的,这样可以才能更好的修改逻辑.

算法题

Leetcode 509. 斐波那契数

题目链接:509. 斐波那契数

 大佬视频讲解:斐波那契数视频讲解

 个人思路

熟悉的课后题,递推公式题目就直接给了,只用初始化数值,然后遍历即可;

解法
动态规划

虽然是道简答题,也要好好分析直至慢慢掌握动规。

动规五部曲:

用一个一维dp数组来保存递归的结果

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

dp[i]的定义为:第i个数的斐波那契数值是dp[i]

2.确定递推公式

题目已经把递推公式直接出:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];

3.dp数组如何初始化

题目中把如何初始化也直接给出了:

dp[0] = 0;
dp[1] = 1;

4.确定遍历顺序

从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的

5.举例推导dp数组

按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],推导一下当N为10的时候,dp数组应该是如下的数列:0 1 1 2 3 5 8 13 21 34 55

代码写出来可以打印一下,如果一样就ok,不一样则debug一下

class Solution {
    public int fib(int n) {
        if (n <= 1) return n;             
        int[] dp = new int[n + 1];
        dp[0] = 0;//初始化
        dp[1] = 1;

        for (int index = 2; index <= n; index++){//遍历
            dp[index] = dp[index - 1] + dp[index - 2];//递推公式
        }
        return dp[n];
    }
}

时间复杂度:O(n);(遍历n个数)

空间复杂度:O( n);(存储一个长度为n+1的dp数组)


 Leetcode  70. 爬楼梯

题目链接:70. 爬楼梯

大佬视频讲解:爬楼梯视频讲解

个人思路

和上一题有些相像,递推公式也是一样的,所以也是很快就能解决;o.O先找找动规做题自信

解法
动态规划

动规的题目如果一眼看不出规律,就多举几个例子就行;

比如:爬到第一层楼梯有一种方法,爬到二层楼梯有两种方法。那么第一层楼梯再跨两步就到第三层 ,第二层楼梯再跨一步就到第三层。所以到第三层楼梯的状态可以由第二层楼梯 和 到第一层楼梯状态推导出来,那么就可以想到动态规划了。

动规五部曲:

定义一个一维数组来记录不同楼层的状态

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

dp[i]: 爬到第i层楼梯,有dp[i]种方法

2.确定递推公式

dp[i]的定义可以看出,dp[i] 可以有两个方向推出来。

首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。

还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。

那么dp[i]就是 dp[i - 1]与dp[i - 2]之和!所以dp[i] = dp[i - 1] + dp[i - 2]

推导dp[i]的时候,一定要时刻想着dp[i]的定义,否则容易跑偏。这体现出确定dp数组以及下标的含义的重要性!

3.dp数组如何初始化

需要注意的是:题目中说了n是一个正整数,题目根本就没说n有为0的情况。所以本题其实就不应该讨论dp[0]的初始化!

所以dp[1] = 1,dp[2] = 2,然后从i = 3开始递推

4.确定遍历顺序

从递推公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,遍历顺序一定是从前向后遍历

5.举例推导dp数组

举例当n为5的时候,dp table(dp数组)应该是这样的

与斐波那契数列唯一的区别是dp[0]在本题没有意义!

public int climbStairs(int n) {
    int[] dp = new int[n + 1];
    dp[0] = 1;//初始化
    dp[1] = 1;
    for (int i = 2; i <= n; i++) {//遍历
        dp[i] = dp[i - 1] + dp[i - 2];//地推公式
    }
    return dp[n];
}

时间复杂度:O(n);(遍历n个数)

空间复杂度:O( n);(存储一个长度为n+1的dp数组)


 Leetcode  746. 使用最小花费爬楼梯

题目链接:746. 使用最小花费爬楼梯

大佬视频讲解:使用最小花费爬楼梯视频讲解

个人思路

这道题加了个花费体力值,那在递推时就要考虑1,2步内选择体力最小的情况累加。

解法
动态规划

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

dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]

2.确定递推公式

可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]

dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。

dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。

选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);

3.dp数组如何初始化

看一下递归公式,dp[i]由dp[i - 1],dp[i - 2]推出,那么需要初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]dp[1]推出。

因为题目说是从 下标 0 下标1 开始跳,初始化 dp[0] = 0,dp[1] = 0;

4.确定遍历顺序

因为dp[i]由dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组

5.举例推导dp数组

拿示例2:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] ,来模拟一下dp数组的状态变化,如下:

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int len = cost.length;
        int[] dp = new int[len + 1];//dp数组

        // 从下标为 0 或下标为 1 的台阶开始,因此支付费用为0
        dp[0] = 0;
        dp[1] = 0;

        // 计算到达每一层台阶的最小费用
        for (int i = 2; i <= len; i++) {
            dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
        }

        return dp[len];
    }
}

时间复杂度:O(n);(遍历cost数组长度)

空间复杂度:O( n);(额外的dp数组来存储中间结果)


 以上是个人的思考反思与总结,若只想根据系列题刷,参考卡哥的网址代码随想录算法官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/523064.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

yarn集群部署

yarn集群部署案例 我们来基于一个案例讲解yarn集群部署 我们要部署yarn集群&#xff0c;需要分别部署HDFS文件系统及YARN集群 Hadoop HDFS分布式文件系统&#xff0c;我们会启动&#xff1a; NameNode进程作为管理节点DataNode进程作为工作节点SecondaryNamenode作为辅助 同…

乐健体育刷分----AI运动的站姿风车

一.前情提要 1.本文仅作学习参考不得用于其他不当途径&#xff0c;若有问题后果自负 二.操作 1.打开乐健体育 2.点击AI运动&#xff0c;找到站姿风车 3.摄像头对准以下图片&#xff0c;拖动图片或保持不动均可 &#xff08;站姿风车2组及以上效果更佳&#xff09;

在实体类中使用JSONObject对象

有时候我们的业务需求可能字段是json格式&#xff0c;这个时候我们的实体类就对应的也应该是json格式&#xff0c;需要使用到JSONObject这个对象&#xff0c;但是可能会使用不了这个对象&#xff0c;那接下来我将简单介绍如何使用这个对象。 以下为我的实体类中的某个字段&…

面试总结------2024/04/04---项目

1.面试官提问&#xff1a;你说你在项目中使用springsecurity jwt 实现了登录功能&#xff0c;能简单讲一下怎么实现的吗&#xff1f; 2.使用RabbitMQ实现订单超时取消功能 redis实现的劣势 订单状态定义 首先&#xff0c;我们需要定义订单的不同状态。在这个示例中&#xf…

ruoyi-vue-pro 前端vue js直接import导入本地文件使用方法

我的xml文件名称叫w2101.xml 第一步&#xff0c;删除所有依赖&#xff0c;否则配置以后就会启动报错&#xff1a; 第二步配置对应的文件格式&#xff0c;我当前使用的是xml文件 config.module.rule(xml).test(/\.xml$/).use(xml-loader).loader(xml-loader).end();第三步…

3D桌面端可视化引擎HOOPS Visualize如何实现3D应用快速开发?

HOOPS Visualize是一个开发平台&#xff0c;可实现高性能、跨平台3D工程应用程序的快速开发。一些主要功能包括&#xff1a; 高性能、以工程为中心的可视化&#xff0c;使用高度优化的OpenGL或DirectX驱动程序来充分利用可用的图形硬件线程安全的C和C#接口&#xff0c;内部利用…

计算机毕业设计选题之基于SSM的旅游管理系统【源码+PPT+文档+包运行成功+部署讲解】

&#x1f493;项目咨询获取源码联系v&#x1f493;xiaowan1860&#x1f493; &#x1f6a9;如何选题&#xff1f;&#x1f351; 对于项目设计中如何选题、让题目的难度在可控范围&#xff0c;以及如何在选题过程以及整个毕设过程中如何与老师沟通&#xff0c;有疑问不清晰的可…

企业如何选择合适自己的ERP系统?ERP系统应该具有哪些功能和特点?

企业如何选择合适自己的ERP系统&#xff1f;ERP系统应该具有哪些功能和特点&#xff1f; ERP作为一款功能如此众多、对企业如此重要的系统&#xff0c;可能会开源免费吗&#xff1f; 如果有这样一款功能全面又完全开源的ERP&#xff0c;早就爆火了&#xff0c;市面上可能还出…

easyocr

刚刚还想更新之前使用的paddleocr&#xff0c;但是发现他的whl文件网站崩了&#xff0c;估计就是最近的事&#xff0c;因为网上所有主流的讲解paddleocr的都用的同一个网站&#xff0c;没办法我顺便也试试github上有没有其他效果稍好的ocr吧 easyocr EasyOCR传送门 这个下载…

文心一言指令词宝典之自媒体篇

作者&#xff1a;哈哥撩编程&#xff08;视频号、抖音、公众号同名&#xff09; 新星计划全栈领域优秀创作者博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏&#xff1a; &#x1f3c5;…

openGauss学习笔记-257 openGauss性能调优-使用Plan Hint进行调优-Custom Plan和Generic Plan选择的Hint

文章目录 openGauss学习笔记-257 openGauss性能调优-使用Plan Hint进行调优-Custom Plan和Generic Plan选择的Hint257.1 功能描述257.2 语法格式257.3 示例 openGauss学习笔记-257 openGauss性能调优-使用Plan Hint进行调优-Custom Plan和Generic Plan选择的Hint 257.1 功能描…

X年后,ChatGPT会替代底层程序员吗?

能不能替代&#xff0c;真的很难说&#xff0c;因为机器换掉人&#xff0c;这其实是一个伦理问题。 其实说白了&#xff0c;任何行业在未来都会被AI或多或少的冲击到&#xff0c;因为ChatGPT做为一个可以持续提升智能的AI&#xff0c;在某些方面的智能程度超过人类并不是什么难…

分闸合闸、电源监视综合装置 HJZZ-91 DC220V 导轨安装Josef约瑟

系列型号&#xff1a; HJZZ-91分闸、合闸、电源监视综合装置&#xff1b; HJZZ-92/1分闸、合闸、电源监视综合装置&#xff1b; HJZZ-92/2分闸、合闸、电源监视综合装置&#xff1b; HJZZ-92/2A分闸、合闸、电源监视综合装置&#xff1b; HJZZ-92/3分闸、合闸、电源监视综合装置…

内网穿透FRPNPSSPPNgrok

目录 穿透上线 FRP&NPS&SPP&Ngrok Ngrok上线 frp上线 nps上线 spp特殊协议上线 穿透上线 FRP&NPS&SPP&Ngrok 主要目的是&#xff1a;实现在自己内网攻击机&#xff0c;去攻击另一个内网的靶机 让一个内网靶机主动连接我们的内网攻击机 Ngrok上线…

分治思想排序(快速排序、归并排序)

分治&#xff1a;分而治之&#xff0c;即把一个复杂的问题分成两个或更多的相同或相似的子问题&#xff0c;再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解&#xff0c;原问题的解即子问题的解的合并 优点&#xff1a; 降低时间复杂度&#xff1a;分治法可…

vscode教程

个人笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔&#xff1a;工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 目录 一&#xff1a…

回合制游戏战斗模块的制作

回合制游戏战斗模块的制作 回合制游戏相信大家没玩过也见过&#xff0c;了解它的玩法。回合制&#xff0c;那就是你来我回的&#xff0c;你一回合我一回合&#xff0c;直到把对方打败。市面上的回合制游戏比较经典的有梦幻西游&#xff0c;问道&#xff0c;神武&#xff0c;完…

基于Springboot的航班进出港管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的航班进出港管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

ThinkPHP审计(2) Thinkphp反序列化链5.1.X原理分析从0编写POC

ThinkPHP审计(2) Thinkphp反序列化链子5.1.X原理分析&从0编写POC 文章目录 ThinkPHP审计(2) Thinkphp反序列化链子5.1.X原理分析&从0编写POC动态调试环境配置Thinkphp反序列化链5.1.X原理分析一.实现任意文件删除二.实现任意命令执行真正的难点 Thinkphp反序列化链5.1.…

探索 2024 年徽标制作的最佳定制 GPT

智能徽标设计革命&#xff1a;探索最佳定制GPT工具 介绍 在快速发展的数字设计世界中&#xff0c;随着定制生成预训练 Transformer (GPT) 的出现&#xff0c;徽标的创建取得了重大飞跃。 这些先进的人工智能工具彻底改变了设计师设计徽标的方式&#xff0c;提供了前所未有的创造…