代码随想录算法训练营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小包传输的可靠性。 测试方法 发送侧基于豆包…...
强化学习在并行机构人形机器人控制中的应用
1. 项目概述在机器人控制领域,强化学习(RL)正逐渐成为解决复杂动力学系统问题的有力工具。然而,当面对具有并行驱动机构的人形机器人时,传统RL训练方法往往面临一个关键挑战:大多数仿真环境无法准确模拟闭环运动链(Closed Kinemat…...
癫痫手术精准定位:基于脑电信号昼夜节律与多生物标志物的机器学习分析框架
1. 项目概述:当机器学习遇见脑电信号,如何让癫痫手术更精准?作为一名长期耕耘在生物医学信号处理与机器学习交叉领域的工程师,我常常思考如何将算法模型从实验室的“玩具”变成临床医生手中可靠的“手术刀”。癫痫,这个…...
Lampiao 靶场
Lampiao 靶场完整渗透解析一、靶场环境信息攻击机(Kali)IP:192.168.146.128靶机 IP:192.168.146.129目标:获取靶机 root 权限与 flag二、步骤 1:信息收集(端口与服务扫描)nmap -p- -…...
[智能体-69]:重新认知MCP:协议不生产智能,只是AI全域交互的标准化基石
MCP只是提供了大模型、编排调度、外部工具能够进行结构化交流的标准,而整个系统的智能主要依赖编排调度,与外部软件系统的交互取决于外部工具,包括外部语音交互、视觉交互、数字化交互。当下MCP(Model Context Protocol࿰…...
基于Arduino的模块化DIY智能时钟:从RTC到RGB LED的完整实现
1. 项目概述:打造一台高度可定制的DIY RGB LED时钟如果你和我一样,对市面上千篇一律的电子钟感到审美疲劳,同时又对Arduino和电子DIY充满热情,那么这个项目可能就是为你准备的。我们不是在简单地组装一个套件,而是在亲…...
【DeepSeek开源协议识别权威指南】:20年合规专家亲授3大协议陷阱与5步精准识别法
更多请点击: https://intelliparadigm.com 第一章:DeepSeek开源协议识别的底层逻辑与合规价值 DeepSeek系列模型(如DeepSeek-V2、DeepSeek-Coder)虽以“开源”名义发布,但其实际许可状态需通过结构化协议解析才能准确…...
保姆级教程:Windows系统下Arcgis 10.2从下载、安装到汉化一次搞定(附常见License启动失败解决方案)
Windows系统下Arcgis 10.2完整安装与汉化实战指南第一次接触Arcgis的新手往往会被复杂的安装流程和神秘的License Manager搞得晕头转向。作为一款功能强大的地理信息系统软件,Arcgis在科研、城市规划、环境监测等领域有着广泛应用,但它的安装过程确实会让…...
为你的Hermes Agent自定义Provider,接入Taotoken多模型池
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为你的Hermes Agent自定义Provider,接入Taotoken多模型池 在构建复杂的AI应用时,开发者常常面临一个核心挑…...
DeepSeek模型微调全链路解析:从数据准备、LoRA配置到推理部署的7大关键步骤
更多请点击: https://intelliparadigm.com 第一章:DeepSeek模型微调全链路概览 DeepSeek系列大语言模型(如DeepSeek-V2、DeepSeek-Coder)凭借其开源特性、高性能推理能力与丰富的领域适配性,已成为工业界与学术界微调…...
计算机视觉的实战项目:从0到1搭建属于自己的图像识别系统
作为软件测试从业者,我们每天都在和各类功能验证、兼容性测试、自动化测试框架打交道,对AI领域的实战项目往往觉得“门槛高”“和日常工作不沾边”。但随着AI技术在互联网产品中的落地越来越深入,图像识别功能已经成为很多APP、智能硬件的核心…...
