代码随想录算法训练营day32
代码随想录算法训练营
—day32
文章目录
- 代码随想录算法训练营
- 前言
- 一、动态规划理论基础
- 二、509. 斐波那契数
- 动态规划
- 动态规划优化空间版
- 递归法
- 三、70. 爬楼梯
- 动态规划
- 动态规划空间优化
- 746. 使用最小花费爬楼梯
- 动态规划空间优化
- 总结
前言
今天是算法营的第32天,希望自己能够坚持下来!
开始动态规划章节了,今日任务:
● 动态规划理论基础
● 509. 斐波那契数
● 70. 爬楼梯
● 746. 使用最小花费爬楼梯
一、动态规划理论基础
文章讲解
视频讲解
动态规划刷题大纲:
动态规划需要有一个推导公式,每一步都是由上一个状态推导出来的。
动态规划五步曲:
- 确定dp数组以及下标的含义
- 确定递归公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
做动规的题目,写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果。
二、509. 斐波那契数
题目链接
文章讲解
视频讲解
思路:
- dp[i]的定义为:第i个数的斐波那契数值是dp[i]
- 递归公式:题目已经把递推公式直接给我们了:dp[i] = dp[i - 1] + dp[i - 2]
- 初始化:dp[0] = 0, dp[1] = 1
- 遍历顺序:因为递推公式是从前往后的,所以遍历顺序是从前往后
动态规划
代码如下:
class Solution {
public://动态规划//dp[i]就是第i个斐波那契数//递推公式:dp[i] = dp[i-1] + dp[i-2];//初始化:dp[0] = 0, dp[1] = 1//遍历顺序:从头到尾int fib(int n) {if (n <= 1) return n;vector<int> dp(n+1);dp[0] = 0;dp[1] = 1;for (int i = 2; i <=n; i++) {dp[i] = dp[i-1] + dp[i-2];}return dp[n];}
};
动态规划优化空间版
因为结果只由前两项决定,所以不需要维护数组,只需要维护三个变量
代码如下:
class Solution {
public://动态规划//dp[i]就是第i个斐波那契数//递推公式:dp[i] = dp[i-1] + dp[i-2];//初始化:dp[0] = 0, dp[1] = 1//遍历顺序:从头到尾int fib(int n) {if (n <= 1) return n;//因为结果只由前两项决定,所以不需要维护数组,只需要维护三个变量int dp[2];dp[0] = 0; //f[n-2]dp[1] = 1; //f[n-1]for (int i = 2; i <=n; i++) {int sum = dp[0] + dp[1]; //f[n] = f[n-1] + f[n-2]dp[0] = dp[1]; //更新f[n-2]dp[1] = sum; //更新f[n-1]}return dp[1];}
};
递归法
这道题也可以用递归法,代码更加简洁:
class Solution {
public://递归法int fib(int n) {if (n < 2) return n;return fib(n - 1) + fib(n - 2);}
};
三、70. 爬楼梯
题目链接
文章讲解
视频讲解
动态规划
思路:
- dp[i]的定义为: 爬到第i层楼梯,有dp[i]种方法
- 递归公式:因为dp[i]都是由i-1走一层或者i-2走两层到达的,而dp[i-1]就是走到i-1层的方法,dp[i-2]就是走到i-2层的方法,那么走到i层就是dp[i-1] + dp[i-2]种方法。
dp[i] = dp[i-1] + dp[i-2]; - 初始化:dp[1] = 1,dp[2] = 2,dp[0]没有含义,题目也说了n是大于0的,所以递推从1开始,初始化1,2,遍历从3开始。
- 遍历顺序:因为递推公式是从前往后的,所以遍历顺序是从前往后
- 举例推导dp数组:
代码如下:
class Solution {
public:int climbStairs(int n) {if (n <= 2) return n;vector<int> dp(n + 1); //需要初始化大小dp[1] = 1;dp[2] = 2;for (int i = 3; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}
};
动态规划空间优化
这道题也是只跟i-1和i-2有关,所以只需要维护3个变量就可以了。
代码如下:
class Solution {
public:int climbStairs(int n) {if (n <= 2) return n;int dp[3]; //优化空间dp[1] = 1;dp[2] = 2;for (int i = 3; i <= n; i++) {int sum = dp[1] + dp[2];dp[1] = dp[2];dp[2] = sum;}return dp[2];}
};
746. 使用最小花费爬楼梯
题目链接
文章讲解
视频讲解
思路:
- dp[i]的定义为:代表走到第i台阶需要花费多少
- 递归公式:第i台阶通过第i-1台阶走一步或者第i-2台阶走两步到达,取两者花费最小为最优解dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
- 初始化:默认第一步不花费体力,第一步从下标0或者1开始, dp[0] = 0, dp[1] = 0
- 遍历顺序:因为递推公式是从前往后的,所以遍历顺序是从前往后
代码如下:
class Solution {
public://d[i]含义:代表走到第i台阶需要花费多少//递推公式,第i台阶通过第i-1台阶走一步或者第i-2台阶走两步到达,取两者花费最小为最优解int minCostClimbingStairs(vector<int>& cost) {if (cost.size() < 2) return 0;vector<int> dp(cost.size() + 1);dp[0] = 0; //默认第一步不花费体力dp[1] = 0;for (int i = 2; i <= cost.size(); i++) {dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}return dp[cost.size()];}
};
动态规划空间优化
同样可以优化空间:
class Solution {
public://d[i]含义:代表走到第i台阶需要花费多少//递推公式,第i台阶通过第i-1台阶走一步或者第i-2台阶走两步到达,取两者花费最小为最优解int minCostClimbingStairs(vector<int>& cost) {if (cost.size() < 2) return 0;int dp[2]; //优化空间dp[0] = 0; //默认第一步不花费体力dp[1] = 0;for (int i = 2; i <= cost.size(); i++) {int sum = min(dp[1] + cost[i - 1], dp[0] + cost[i - 2]);dp[0] = dp[1];dp[1] = sum;}return dp[1];}
};
总结
动态规划第一天!第一次接触动态规划,牢记动态规划五步曲:
- 确定dp数组以及下标的含义
- 确定递归公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
一些小总结:
- 想不明白的时候需要回归dp数组下标含义再理解一下。
- 初始化的时候如果遇到像是dp[0]没有含义的时候,试试从后面的dp[1]dp[2]比较明确初始化的下标开始初始化和递推。
- 当递推公式只涉及i-1,i-2的时候,可以缩小数组大小,只维护最小的数组来节省空间。
明天继续加油!
相关文章:

代码随想录算法训练营day32
代码随想录算法训练营 —day32 文章目录 代码随想录算法训练营前言一、动态规划理论基础二、509. 斐波那契数动态规划动态规划优化空间版递归法 三、70. 爬楼梯动态规划动态规划空间优化 746. 使用最小花费爬楼梯动态规划空间优化 总结 前言 今天是算法营的第32天,…...

缓存之美:万文详解 Caffeine 实现原理(下)
上篇文章:缓存之美:万文详解 Caffeine 实现原理(上) getIfPresent 现在我们对 put 方法有了基本了解,现在我们继续深入 getIfPresent 方法: public class TestReadSourceCode {Testpublic void doRead() …...

中企出海:从国际投资建厂:投前投中投后重点事项
1. 投前重点事项 1.1 市场调研与分析 在国际投资建厂的投前阶段,市场调研与分析是至关重要的基础工作,它能够帮助企业全面了解目标市场,为后续决策提供有力依据。 市场规模与潜力:通过收集和分析目标国家或地区的经济数据、行业…...

github登录用的TOTP和恢复码都丢失了怎么办
从22年左右开始github的登录就需要用TOTP的一个6位秘钥做二次认证登录,如果在用的TOTP软件失效了,可以用github开启二次认证时下载的恢复码重置认证,但是如果你和我一样这两个东西都没了就只能用邮箱重置了,过程给大家分享一下 一…...

最长递增子序列问题(Longest Increasing Subsequence),动态规划法解决,贪心算法 + 二分查找优化
问题描述:在一个大小乱序的数列中,找到一个最大长度的递增子序列,子序列中的数据在原始数列中的相对位置保持不变,可以不连续,但必须递增。 输入描述: 第一行输入数列的长度 n。(1 < n < 200) 第二…...

Python中采用.add_subplot绘制子图的方法简要举例介绍
Python中采用.add_subplot绘制子图的方法简要举例介绍 目录 Python中采用.add_subplot绘制子图的方法简要举例介绍一、Python中绘制子图的方法1.1 add_subplot函数1.2 基本语法(1)add_subplot的核心语法(2)add_subplot在中编程中的…...

纯 Python、Django、FastAPI、Flask、Pyramid、Jupyter、dbt 解析和差异分析
一、纯 Python 1.1 基础概念 Python 是一种高级、通用、解释型的编程语言,以其简洁易读的语法和丰富的标准库而闻名。“纯 Python” 在这里指的是不依赖特定的 Web 框架或数据分析工具,仅使用 Python 原生的功能和标准库来开发应用程序或执行任务。 1.…...

C++实现有限元二维杆单元计算 Bar2D2Node类(纯自研 非套壳)
本系列文章致力于实现“手搓有限元,干翻Ansys的目标”,基本框架为前端显示使用QT实现交互,后端计算采用Visual Studio C。 QT软件界面 具体软件操作可查看下方视频哦。也可以点击这里直接跳转。 直接干翻Ansys?小伙自研有限元 1、…...

wx036基于springboot+vue+uniapp的校园快递平台小程序
开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…...

Unity中两个UGUI物体的锚点和中心点设置成不一样的,然后怎么使两个物体的位置一样?
一、问题复现 需求:go1物体和我想把go1的位置跟go2的位置一样,但是我通过物体的anchoredPosition以及position还有localposiiton都没有解决问题,使用上面的这三个属性的效果如下: 运行之后,可以看出,go1的…...

兼职全职招聘系统架构与功能分析
2015工作至今,10年资深全栈工程师,CTO,擅长带团队、攻克各种技术难题、研发各类软件产品,我的代码态度:代码虐我千百遍,我待代码如初恋,我的工作态度:极致,责任ÿ…...

HTML5 History API
在 HTML5 的 History API 中,pushState 和 replaceState 方法也可以接受一个 state 对象作为参数。这些方法允许你在改变浏览器路由时不重新加载页面,并且可以附加一些自定义数据。 state 返回在 history 栈顶的 任意 值的拷贝。 let currentState h…...

2025_1_22打卡
402. 移掉 K 位数字 - 力扣(LeetCode) 279. 完全平方数 - 力扣(LeetCode)...

Formality:不可读(unread)的概念
相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482https://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 在Formality中有时会遇到不可读(unread)这个概念,本文就将对此…...

stm32f103C8T6和AT24C256链接
模拟IIC总线 myiic.c #ifndef __24CXX_H #define __24CXX_H #include "myiic.h" #define AT24C01 127 //1kbit1*1024/8128byte地址寻址范围为0-127 #define AT24C02 255 #define AT24C04 511 #define AT24C08 1023 #define AT24C16 2047 #define AT24C32 …...

5.SQLAlchemy对两张有关联关系表查询
问题 例如,一个用户可以有多个收获地址。 定义表如下: 用户表 地址表 一般情况,我们会先查询用户表,拿到用户id后,再到地址表中查询关联的地址数据。这样就要执行两次查询。 仅仅为了方便查询,需要一些属…...

2.2.1 语句结构
ST(Structured Text)语言是一种基于IEC 61131-3标准的高级文本编程语言,其语法规则严格且清晰。以下是ST语言中关于分号、注释和代码块的详细语法规则说明: 分号(;)作用:分号用于表示语句的结束。语法规则: 每个独立的语句必须以分号结尾。分号是语句的终止符,用于分隔…...

安当二代TDE透明加密技术与SMS凭据管理系统相结合的数据库安全解决方案
安当二代TDE透明加密技术与安当SMS凭据管理系统的结合,为企业提供了一套完整的数据库安全解决方案,涵盖字段级加密脱敏和动态凭据管理两大核心功能。以下是其实现方式和技术特点的详细说明: 一、安当二代TDE透明加密技术:字段级加…...

es的date类型字段按照原生格式进行分组聚合
PUT student2 { "mappings": {"properties": {"name": {"type": "text","analyzer": "standard" // 使用标准分析器,适合姓名字段},"birthday": {"type": "date&…...

高频次UDP 小包丢包分析
目录 背景测试方法测试结果case1: (经过多级交换机)case2: 长时测试(经过多级交换机)case3: 长时测试(设备直联)可能原因分析解决方法背景 UDP作为面向非连接的传输协议,并不能保证可靠交付。本文编写代码测试设备之间UDP小包传输的可靠性。 测试方法 发送侧基于豆包…...

科目四考试内容
一、考试内容 科目四考试主要包含以下五个方面的内容: 法律法规与规章制度:理解并掌握道路交通规则,涉及交通信号、标志、标线以及相关设施的运用。综合判断与案例分析:培养学员应对复杂交通情况的能力,学会识别违法…...

2015 年 4 月多省(区、市)公务员录用考试 《申论》真题详解
一)“给定资料1~2”反映了人们在过去的工作和生活方面形成的很多“惯例”或“习惯做法”正在悄然改变。请分析导致这种改变发生的主要原因。(20分) 一、给定资料 材料1: 互联网的日益普及和开发利用,不断为人…...

四、CSS效果
一、box-shadow box-shadow:在元素的框架上添加阴影效果 /* x 偏移量 | y 偏移量 | 阴影颜色 */ box-shadow: 60px -16px teal; /* x 偏移量 | y 偏移量 | 阴影模糊半径 | 阴影颜色 */ box-shadow: 10px 5px 5px black; /* x 偏移量 | y 偏移量 | 阴影模糊半径 | 阴影扩散半…...

全面评测 DOCA 开发环境下的 DPU:性能表现、机器学习与金融高频交易下的计算能力分析
本文介绍了我在 DOCA 开发环境下对 DPU 进行测评和计算能力测试的一些真实体验和记录。在测评过程中,我主要关注了 DPU 在高并发数据传输和深度学习场景下的表现,以及基本的系统性能指标,包括 CPU 计算、内存带宽、多线程/多进程能力和 I/O 性…...

图论 八字码
我们可能惊异于某些技巧。我们认为这个技巧真是巧妙啊。或者有人认为我依靠自己的直觉想出了这个表示方法。非常自豪。我认为假设是很小的时候,比如说小学初中,还是不错的。到高中大学,就有一些不成熟了。因为这实际上是一个竞技。很多东西前…...

OSI5GWIFI自组网协议层次对比
目录 5G网络5G与其他协议栈各层映射 5G网络 物理层 (PHY) 是 5G 基站协议架构的最底层,负责将数字数据转换为适合无线传输的信号,并将接收到的无线信号转换为数字数据。实现数据的编码、调制、多天线处理、资源映射等操作。涉及使用新的频段(…...

北理新源监控平台都管理哪些数据
北理新源信息科技有限公司(简称“北理新源”)依托北京理工大学电动车辆国家工程研究中心,建设和运营了“新能源汽车国家监测与管理平台”。该平台是国家级的新能源汽车数据监管平台,主要负责对新能源汽车的运行数据进行采集、监测…...

WPS不登录无法使用基本功能的解决方案
前言 WPS不登录无法使用基本功能的原因通常是为了同步数据、提供更多高级功能或满足软件授权要求。然而,一些用户可能出于隐私或便捷性的考虑,不愿意登录账号。在这种情况下,WPS可能会限制未登录用户的使用权限,导致工具栏变灰…...

车载软件架构 --- CP和AP作为中央计算平台的软件架构双核心
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…...

【技巧】优雅的使用 pnpm+Monorepo 单体仓库构建一个高效、灵活的多项目架构
单体仓库(Monorepo)搭建指南:从零开始 单体仓库(Monorepo)是一种将多个相关项目集中管理在一个仓库中的开发模式。它可以帮助开发者共享代码、统一配置,并简化依赖管理。本文将通过实际代码示例࿰…...