算法打卡day33|动态规划篇01|动态规划理论基础| Leetcode 509. 斐波那契数、70. 爬楼梯、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 的台阶开始,因此支付费用为0dp[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数组来存储中间结果)


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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

坦克大战_java源码_swing界面_带毕业论文

一. 演示视频 坦克大战_java源码_swing界面_带毕业论文 二. 实现步骤 完整项目获取 https://githubs.xyz/y22.html 部分截图 启动类是 TankClinet.java&#xff0c;内置碰撞检测算法&#xff0c;线程&#xff0c;安全集合&#xff0c;一切皆对象思想等&#xff0c;是java进阶…

【vue2+antvx6】报错Cannot read properties of undefined (reading ‘toUpperCase‘)

我的代码是这样的 <el-collapseref"collapse"v-model"active"accordionclass"collapseStart"change"collapsechange"><el-collapse-item:name"String(index 1)"v-for"(i, index) in List":key"in…

杂货铺 | 使用 Github Pages 和 Hexo 搭建自己的独立博客

文章目录 &#x1f4da;Step1&#xff1a;安装Node.js和Git&#x1f4da;Step2&#xff1a;安装并初始化配置Hexo&#x1f4da;Step3&#xff1a;本地查看效果&#x1f4da;Step4&#xff1a;将博客部署到Github Pages上&#x1f407;创建项目代码库&#x1f407;配置SSH密钥&a…

本题解答错误----暂做记录----130. 被围绕的区域

130. 被围绕的区域 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;_130被围绕的区域_dfs_130被围绕的区域_bfs_01 错误经验吸取 原题链接&#xff1a; 添加链接描述130. 被围绕的区域 https://leetcode.cn/problems/surrounded-regions…

JavaSE:抽象类和接口

目录 一、前言 二、抽象类 &#xff08;一&#xff09;抽象类概念 &#xff08;二&#xff09;使用抽象类的注意事项 &#xff08;三&#xff09;抽象类的作用 三、接口 &#xff08;一&#xff09;接口概念 &#xff08;二&#xff09;接口语法规则 &#xff08;三&a…

Leetcode 423. 从英文中重建数字

给你一个字符串 s &#xff0c;其中包含字母顺序打乱的用英文单词表示的若干数字&#xff08;0-9&#xff09;。按 升序 返回原始的数字。 示例 1&#xff1a; 输入&#xff1a;s “owoztneoer” 输出&#xff1a;“012” 示例 2&#xff1a; 输入&#xff1a;s “fviefur…

jakarta 实现 HttpClient

正在使用quarkus开发项目。使用jdk17&#xff0c;过去的HttpClient不能用了&#xff0c;经过一番周折&#xff0c;重新实现了HttpClient简单版&#xff0c;代码如下 import jakarta.enterprise.context.ApplicationScoped; import jakarta.ws.rs.client.Client; import jaka…

视频创作者必备应用!三步帮你解决前置内容条件,打造专属大片!

你还没尝试过AI视频生成&#xff1f;AI技术逐渐浸透我们的生活&#xff0c;太多的事物变得有了捷径可走。AI视频生成为创作者们提供更加便利快捷的输出形式&#xff0c;更优质更契合的生产内容。尝试AI视频生成系列应用&#xff0c;迎接AI宇宙&#xff01; 生成剧本分镜 视频…

Unity Toggle组件

Toggle Group组件 Allow Switch Off属性值为false时&#xff0c; 1&#xff0c;Toggle初始时默认会有一个被勾选&#xff08;ison为true&#xff09;&#xff0c;可以自己打勾指定 2&#xff0c;不能取消勾选 Allow Switch Off属性值为true时&#xff0c; 1&#xff0c;Toggl…

抖音招聘如何报白?

抖音招聘如何报白&#xff1f; 人力资源行业报白的好处&#xff0c;最直接的就是在直播和视频中发布招聘和企业信息&#xff0c;不用担心被封禁和限制流量。 可以通过抖音直播进行招聘&#xff0c;也可以在视频中添加小程序&#xff0c;流量不会受到限制&#xff0c;等于多了…

海德堡MC8B Kbox C101工业电脑维修印刷机工控机HEIDELBERG主机

海德堡推出具有增强自动化和人体工程学设计的新型印刷机 海德堡推出了新一代 Speedmaster SX 102&#xff0c;据称该打印机通过人工智能和其他自动化辅助系统进行了增强&#xff0c;可提供符合人体工程学的用户体验和高质量的商业印刷。 据海德堡介绍&#xff0c;Speedmaster…

LabVIEW专栏五、网口

该节目标编写一个网口调试VI。 上一章是串口&#xff0c;这章介绍网口的写法。 一、网口硬件 1.1、上位机网口 1.2、网口线 由线缆和水晶头组成&#xff0c;现在一般用5类和超5类的网线 1.3、接线方式 忽略&#xff0c;这里加上这点为了提醒一个硬件和上位机连接&#xf…

[Python学习篇] Python格式化输出

输出关键字 print 语法&#xff1a;print("内容") 示例&#xff1a;print("123") 格式化符号 符号转换%s字符串%c字符%d有符号的十进制整数 &#xff08;输出正整数 和负整数-&#xff09;%03d&#xff1a;表示输出3位数字&#xff0c;如果不足3位在数字前…

[NSSRound#8 Basic]MyPage

[NSSRound#8 Basic]MyPage 打开页面后什么都没有 尝试使用php伪协议 //读取文件源码 filephp://filter/readconvert.base64-encode/resourceindex.php 显示&#xff1a;空白一片 filephp://filter/readconvert.base64-encode/resource/var/www/html/index.php 显示&#xff1…

推箱子_java源码_50张地图_带背景音乐

一. 演示视频 推箱子_java源码_50张地图_带背景音乐 二. 实现步骤 完整项目获取 https://githubs.xyz/y23.html 部分截图 map地图实现 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00…

C# 关于Encoding编码 举例UTF8

在UTF-8编码中&#xff0c;一个字符可能由一个或多个字节组成。每个字节的前几位用于指示该字符需要多少字节来表示。具体来说&#xff0c;UTF-8编码使用以下规则&#xff1a; 如果一个字节的最高位是0&#xff0c;那么它表示一个ASCII字符&#xff0c;并且该字节就是该字符的…

SpringSecurity2

AuthenticationManagerBuilder 继承了之前提到的AbstractConfiguredSecurityBuilder构造器 postProcess安全对象的后处理&#xff0c;那么ProviderManager是什么 ProviderManager Authentication public interface Authentication extends Principal, Serializable {/**** …

学习笔记】java项目—苍穹外卖day05

文章目录 苍穹外卖-day05课程内容1. Redis入门1.1 Redis简介1.2 Redis下载与安装1.2.1 Redis下载1.2.2 Redis安装 1.3 Redis服务启动与停止1.3.1 服务启动命令1.3.2 客户端连接命令1.3.3 修改Redis配置文件1.3.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常用数据类型介绍…

Spring 源码调试错误修复

Spring 源码调试错误修复 文章目录 Spring 源码调试错误修复1. fatal: not a git repository (or any of the parent directories): .git问题描述解决方案 2. fatal: Needed a single revision问题描述解决方案 1. fatal: not a git repository (or any of the parent director…

openGauss 函数及存储过程支持

函数及存储过程支持 可获得性 本特性自openGauss 1.1.0版本开始引入。 特性简介 函数和存储过程是数据库中的一种重要对象&#xff0c;主要功能将用户特定功能的SQL语句集进行封装&#xff0c;并方便调用。 客户价值 允许客户模块化程序设计&#xff0c;对SQL语句集进行封…