代码随想录算法训练营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小包传输的可靠性。 测试方法 发送侧基于豆包…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...