代码随想录算法训练营day32

news2025/1/23 18:30:02

代码随想录算法训练营

—day32

文章目录

  • 代码随想录算法训练营
  • 前言
  • 一、动态规划理论基础
  • 二、509. 斐波那契数
    • 动态规划
    • 动态规划优化空间版
    • 递归法
  • 三、70. 爬楼梯
    • 动态规划
    • 动态规划空间优化
  • 746. 使用最小花费爬楼梯
    • 动态规划空间优化
  • 总结


前言

今天是算法营的第32天,希望自己能够坚持下来!
开始动态规划章节了,今日任务:
● 动态规划理论基础
● 509. 斐波那契数
● 70. 爬楼梯
● 746. 使用最小花费爬楼梯


一、动态规划理论基础

文章讲解
视频讲解

动态规划刷题大纲:
在这里插入图片描述
动态规划需要有一个推导公式,每一步都是由上一个状态推导出来的。

动态规划五步曲:

  1. 确定dp数组以及下标的含义
  2. 确定递归公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

做动规的题目,写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果。


二、509. 斐波那契数

题目链接
文章讲解
视频讲解

思路:

  1. dp[i]的定义为:第i个数的斐波那契数值是dp[i]
  2. 递归公式:题目已经把递推公式直接给我们了:dp[i] = dp[i - 1] + dp[i - 2]
  3. 初始化:dp[0] = 0, dp[1] = 1
  4. 遍历顺序:因为递推公式是从前往后的,所以遍历顺序是从前往后

动态规划

代码如下:

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. 爬楼梯

题目链接
文章讲解
视频讲解

动态规划

思路:

  1. dp[i]的定义为: 爬到第i层楼梯,有dp[i]种方法
  2. 递归公式:因为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];
  3. 初始化:dp[1] = 1,dp[2] = 2,dp[0]没有含义,题目也说了n是大于0的,所以递推从1开始,初始化1,2,遍历从3开始。
  4. 遍历顺序:因为递推公式是从前往后的,所以遍历顺序是从前往后
  5. 举例推导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. 使用最小花费爬楼梯

题目链接
文章讲解
视频讲解

思路:

  1. dp[i]的定义为:代表走到第i台阶需要花费多少
  2. 递归公式:第i台阶通过第i-1台阶走一步或者第i-2台阶走两步到达,取两者花费最小为最优解dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
  3. 初始化:默认第一步不花费体力,第一步从下标0或者1开始, dp[0] = 0, dp[1] = 0
  4. 遍历顺序:因为递推公式是从前往后的,所以遍历顺序是从前往后

代码如下:

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];
    }
};

总结

动态规划第一天!第一次接触动态规划,牢记动态规划五步曲:

  1. 确定dp数组以及下标的含义
  2. 确定递归公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

一些小总结:

  1. 想不明白的时候需要回归dp数组下标含义再理解一下。
  2. 初始化的时候如果遇到像是dp[0]没有含义的时候,试试从后面的dp[1]dp[2]比较明确初始化的下标开始初始化和递推。
  3. 当递推公式只涉及i-1,i-2的时候,可以缩小数组大小,只维护最小的数组来节省空间。

明天继续加油!

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

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

相关文章

设计模式的艺术-开闭原则

原则使用频率图&#xff08;仅供参考&#xff09; 1.如何理解开闭原则 简单来说&#xff0c;开闭原则指的是 “对扩展开放&#xff0c;对修改关闭”。 当软件系统需要增加新的功能时&#xff0c;应该通过扩展现有代码的方式来实现&#xff0c;而不是去修改已有的代码。 例如我…

grafana新增email告警

选择一个面板 比如cpu 新增一个临界点表达式 input选A 就是A的值达到某个临界点 触发告警 我这边IS ABOVE0.15就是cpu大于0.15%就触发报警&#xff0c;这个值怎么填看指标的值显示 这里要设置一下报警条件 这边随便配置下 配置标签和通知&#xff0c;选择你的邮件 看下告警…

C++17 新特性深入解析:constexpr 扩展、if constexpr 和 constexpr lambda

C17 不仅增强了现有特性&#xff0c;还引入了一些全新的编程工具&#xff0c;极大地提升了代码的效率和表达力。在这篇文章中&#xff0c;我们将深入探讨 C17 中与 constexpr 相关的三个重要特性&#xff1a;constexpr 的扩展用法、if constexpr 和 constexpr lambda。这些特性…

ChatGPT 摘要,以 ESS 作为你的私有数据存储

作者&#xff1a;来自 Elastic Ryan_Earle 本教程介绍如何设置 Elasticsearch 网络爬虫&#xff0c;将网站索引到 Elasticsearch 中&#xff0c;然后利用 ChatGPT 使用我们的私人数据来总结对其提出的问题。 Python 脚本的 Github Repo&#xff1a;https://github.com/Gunner…

算法刷题笔记——图论篇

这里写目录标题 理论基础图的基本概念图的种类度 连通性连通图强连通图连通分量强连通分量 图的构造邻接矩阵邻接表 图的遍历方式 深度优先搜索理论基础dfs 与 bfs 区别dfs 搜索过程深搜三部曲所有可达路径广度优先搜索理论基础广搜的使用场景广搜的过程 岛屿数量孤岛的总面积沉…

神经网络:什么是交叉熵?

在机器学习和深度学习中&#xff0c;交叉熵&#xff08;Cross Entropy&#xff09; 是一种常见的损失函数&#xff0c;特别适用于分类问题。尽管这个术语听起来可能有点复杂&#xff0c;但通过一个类比&#xff0c;我们可以更直观地理解它的含义和作用。 类比场景&#xff1a;…

数据结构——队列和栈(介绍、类型、Java手搓实现循环队列)

我是一个计算机专业研0的学生卡蒙Camel&#x1f42b;&#x1f42b;&#x1f42b;&#xff08;刚保研&#xff09; 记录每天学习过程&#xff08;主要学习Java、python、人工智能&#xff09;&#xff0c;总结知识点&#xff08;内容来自&#xff1a;自我总结网上借鉴&#xff0…

[Spring] OpenFeign的使用

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

LangChain + llamaFactory + Qwen2-7b-VL 构建本地RAG问答系统

单纯仅靠LLM会产生误导性的 “幻觉”&#xff0c;训练数据会过时&#xff0c;处理特定知识时效率不高&#xff0c;缺乏专业领域的深度洞察&#xff0c;同时在推理能力上也有所欠缺。 正是在这样的背景下&#xff0c;检索增强生成技术&#xff08;Retrieval-Augmented Generati…

SpringCloud Gateway 集成 Sentinel 详解 及实现动态监听Nacos规则配置实时更新流控规则

目录 一、前言二、版本选择和适配2.1、本文使用各组件版本2.2、官方推荐版本 三、部署sentinel-dashboard3.1、下载 sentinel-dashboard jar包3.2、启动 sentinel-dashboard 四、Gateway 集成 Sentinel实现控制台配置流控规则测试4.1、添加Gateway 集成 Sentinel 包4.2、添加 G…

三相电变为家庭220V,市电火线和零线关系,为什么用三相电输送

参考&#xff1a; https://www.zhihu.com/question/30555841/answer/85723024 上面是电力系统的主要组成&#xff0c;发电站发电后升压传输&#xff0c;然后到各大城市再降压使用。 我们看到电塔上都是三根线&#xff0c;那么因为整个过程都是三相电。 为什么用三相电&#xff…

YOLOv8改进,YOLOv8检测头融合DSConv(动态蛇形卷积),并添加小目标检测层(四头检测),适合目标检测、分割等

精确分割拓扑管状结构例如血管和道路,对各个领域至关重要,可确保下游任务的准确性和效率。然而,许多因素使任务变得复杂,包括细小脆弱的局部结构和复杂多变的全局形态。在这项工作中,注意到管状结构的特殊特征,并利用这一知识来引导 DSCNet 在三个阶段同时增强感知:特征…

DNS未响应服务问题的解决(电脑连着网但浏览器访问不了网页)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

鸿蒙Harmony json转对象(1)

案例1 运行代码如下 上图的运行结果如下: 附加1 Json_msg interface 案例2 import {JSON } from kit.ArkTS; export interface commonRes {status: numberreturnJSON: ESObject;time: string } export interface returnRes {uid: stringuserType: number; }Entry Component …

Transformer详解:Attention机制原理

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;本系列文章是作者参加DataWhale2025年1月份学习赛&#xff0c;旨在讲解Transformer模型的理论和实践。&#x1f632; 本文将详细探讨Attention机制的原理…

SpringBoot为什么要禁止循环依赖?

大家好&#xff0c;我是锋哥。今天分享关于【SpringBoot为什么要禁止循环依赖?】面试题。希望对大家有帮助&#xff1b; SpringBoot为什么要禁止循环依赖? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Boot 禁止循环依赖的原因与 Spring 框架本身的设计…

利用Qt5.15.2编写Android程序时遇到的问题及解决方法

文章目录 背景1.文件读写 背景 目前我用的是Qt5.15.2来编写Qt程序&#xff0c;环境的配置看我这篇文章【Qt5.15.2配置Android开发环境】 项目中的一些配置的截图&#xff1a; 1.文件读写 假如直接用 QFileDialog::getExistingDirectory来获取路径的话&#xff0c;会得到类…

RV1126+FFMPEG推流项目源码

源码在我的gitee上面&#xff0c;感兴趣的可以自行了解 nullhttps://gitee.com/x-lan/rv126-ffmpeg-streaming-projecthttps://gitee.com/x-lan/rv126-ffmpeg-streaming-project

三维扫描赋能文化:蔡司3D扫描仪让木质文化遗产焕发新生-沪敖3D

挪威文化历史博物馆在其修复工作中融入现代3D扫描技术&#xff0c;让数百年的历史焕发新生。 文化历史博物馆的工作 文化历史博物馆是奥斯陆大学的一个院系。凭借其在文化历史管理、研究和传播方面的丰富专业知识&#xff0c;该博物馆被誉为挪威博物馆研究领域的领先机构。馆…

2024年美赛C题评委文章及O奖论文解读 | AI工具如何影响数学建模?从评委和O奖论文出发-O奖论文做对了什么?

模型假设仅仅是简单陈述吗&#xff1f;允许AI的使用是否降低了比赛难度&#xff1f;还在依赖机器学习的模型吗&#xff1f;处理题目的方法有哪些&#xff1f;O奖论文的优点在哪里&#xff1f; 本文调研了当年赛题的评委文章和O奖论文&#xff0c;这些问题都会在文章中一一解答…