动态规划:从入门到入土系列(一)

news2025/1/2 12:28:24

在这里插入图片描述

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏1: 🍔🍟🌯C语言初阶
🐻推荐专栏2: 🍔🍟🌯C语言进阶
🔑个人信条: 🌵知行合一

前言

本篇是动态规划系列的入门基础题,以"第 n 个泰波那契数"和 "三步问题"为例子.

目录

  • 前言
  • 一、第 n 个泰波那契数
    • 题目描述:
    • 算法讲解:
    • 代码实现:
    • 空间优化:
  • 二、三步问题
    • 题目描述:
    • 算法讲解:
    • 代码实现:
  • 三、 结语:

一、第 n 个泰波那契数

题目来源于:力扣
题目链接:传送门

题目描述:

泰波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

示例 1:

输入:n = 4
输出:4
解释:
T_3 = 0 + 1 + 1 = 2
T_4 = 1 + 1 + 2 = 4

示例2:

输入:n = 25
输出:1389537

算法讲解:

  1. 创建dp表.
    确定状态表示:用dp[n]表示第 n 个泰波那契数 Tn 的值.
    我们要返回Tn的值,也就是第n个泰波那契数,由于T0的存在(即有第0个泰波那契数),所以我们创建dp表的时候,需要创建n+1个大小的数组,即dp[n+1].
    ·需要设置的文字

  2. 初始化.
    前面三个泰波那契数的值题目都已经给出,dp[0]=0,dp[1]=1,dp[2]=1;

  3. 填写dp表.
    根据题目介绍,我们不难得出状态转移方程是:Tn+3 = Tn + Tn+1 + Tn+2
    即:Tn = Tn-3 + Tn-2 + Tn-1

在这里插入图片描述

本题中是直接给出了状态转移方程,大多数动态规划的题目是需要我们自己推导的.

  1. 确认返回值.
    题目要求返回第 n 个泰波那契数 Tn 的值,那dp[n]不就是我们需要返回的吗?
  2. 细节处理:
    由于0<n<=2时,无法进行完整的初始化操作,我们可以提前进行判定直接返回.

代码实现:

class Solution {
public:
    int tribonacci(int n) {
        //防止因为n过小导致的初始化问题
        if(n==0) return 0;
        if(n==1||n==2)return 1;

        //1.创建dp表
        int dp[n+1];
        //2.初始化
        dp[0]=0,dp[1]=1,dp[2]=1;
        //3.填表
        for(int i=3;i<=n;i++)
        {
            dp[i]=dp[i-3]+dp[i-2]+dp[i-1];
        }
        //4.确认返回值
        return dp[n];
    }
};

空间优化:

在上面的算法中,我们创建了n+1个大小的数组空间,所以空间复杂度是O(n),我们可以采用滚动数组的方法,将时间复杂度降到O(1).

其实我们可以不用创建n+1个大小的数组空间,因为只需要知道第n项的前三个,就可以推导出第四项,所以我们可以创建只有四个大小的数组空间.

在这里插入图片描述

class Solution {
public:
    int tribonacci(int n) {
        //防止因为n过小导致的初始化问题
        if(n==0) return 0;
        if(n==1||n==2)return 1;

        //1.创建dp表
        int dp[4];
        //2.初始化
        dp[0]=0,dp[1]=1,dp[2]=1;
        //3.填表
        for(int i=3;i<=n;i++)
        {
            dp[3]=dp[2]+dp[1]+dp[0];
            //动态更新数组(滚动数组)
            dp[0]=dp[1];
            dp[1]=dp[2];
            dp[2]=dp[3];
        }
        //4.确认返回值
        return dp[3];
    }
};

在这里插入图片描述

二、三步问题

题目来源于:力扣
题目链接:传送门

题目描述:

三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007

示例1:

输入:n = 3
输出:4
说明: 有四种走法

示例2:

输入:n = 5
输出:13

算法讲解:

  1. 创建dp表:
    确定状态表示:dp[n]代表有n阶楼梯时,小孩可以选择上楼的方式.
    我们要j计算的是当有n阶台阶时,小孩有多少种上楼梯的方式.
    并且此题规定:0个台阶时,有一种上楼方式.
    所以我们创建dp表的时候,需要创建n+1个大小的数组,即dp[n+1].

  2. 初始化:
    上楼梯的方法:dp[0]=1,dp[1]=1,dp[2]=2;

  3. 填写dp表.
    先看懂题目意思,此题需要自行推导状态转移方程.
    分析: dp[0]=1,dp[1]=1.

在这里插入图片描述
4. 确认返回值:
dp[n]代表有n阶楼梯时,我们可以选择的上楼方式.所以返回dp[n]即可.

5.细节处理:
(1)由于0<n<=2时,无法进行完整的初始化操作,我们可以提前进行判定直接返回.
(2)由于这里数据比较大,所以每次进行"+"运算时,需要进行对结果取模(1000000007).

代码实现:

class Solution {
public:
    int waysToStep(int n) {
        const int MOD =1000000007;
        
        //防止因为n过小导致的初始化问题
        if(n==0||n==1)return 1;
        if(n==2)return 2;
		
		//创建dp数组
        int dp[n+1];
        //初始化操作
        dp[0]=1,dp[1]=1,dp[2]=2;
        //填表
        for(int i=3;i<=n;i++)
        {
            dp[i]=((dp[i-3]+dp[i-2])%MOD+dp[i-1])%MOD;//这里一定要记得取模
        }
        //返回值
        return dp[n];
    }
};

运行结果:
在这里插入图片描述

当然也可以使用滚动数组的方式进行空间优化,这里就不再演示了.

三、 结语:

本篇是动态规划系列的入门基础题,题目难度偏简单,后续会慢慢更新,难度有所提升.
下篇见!
在这里插入图片描述

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

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

相关文章

高级web前端开发工程师岗位的具体内容概述

高级web前端开发工程师岗位的具体内容概述1 职责&#xff1a; 1、负责前端页面开发和维护&#xff0c;并根据需求优化产品性能、用户体验、交互效果及各种主流浏览器以及各类型移动客户端的兼容适配工作; 2、配合产品经理和UI设计师&#xff0c;通过各种前端技术手段&#xf…

[MySQL]MySQL用户管理

[MySQL]MySQL用户管理 文章目录 [MySQL]MySQL用户管理1. 用户的概念2. 用户信息3. 创建用户4. 修改用户密码5. 删除用户6. MySQL中的权限7. 给用户授权8. 回收权限 1. 用户的概念 MySQL中的用户分为超级用户&#xff08;root&#xff09;和普通用户。超级用户的操作是不受权限…

IDEA对JPA@Query查询的文本块支持

IDEA对JPAQuery查询的文本块支持 参考网址 JPA查询方式&#xff1a;方法命名规则、Query查询、结果集类型转化器 原先JPA的Query注解查询存在的问题 编写SQL时需要在value的""内&#xff0c;使用换行时会拼接字符串&#xff0c;观感极差如果SQL中使用到了单引号&…

第三十二章:MySQL事务日志

第三十二章&#xff1a;MySQL事务日志 32.1&#xff1a;概述 事物有4种特性&#xff1a;原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢&#xff1f; 事物的隔离性有锁机制实现。而事物的原子性、一致性和持久性由事物的redo日志和undo日志来…

基于深度学习淡水鱼体重智能识别模型研究

工作原理为&#xff1a;首先对大众淡水鱼图片进行数据清洗并做标签分类&#xff0c;之后基于残差网络ResNet50模型进行有监督的分类识别训练&#xff0c;获取识别模型。其次通过搭建回归模型设计出体重模型&#xff0c;对每一类淡水鱼分别拟合出对应的回归方程&#xff0c;将获…

【基础算法】——双指针算法

文章目录 一、算法原理二、算法实战1. 力扣283 移动零2. 力扣1089 复写零3. 力扣15 三数之和4. 力扣18 四数之和 三、总结 一、算法原理 双指针算法是指在遍历对象的过程中不是普通的使用单个指针进行访问&#xff0c;而是使用两个相同方向(快慢指针)或者相反方向&#xff08;…

机器学习实战11-基于K-means算法的文本聚类分析,生成文本聚类后的文件

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍机器学习实战11-基于K-means算法的文本聚类分析&#xff0c;生成文本聚类后的文件。文本聚类分析是NLP领域的一个核心任务&#xff0c;通过将相似的文本样本分组&#xff0c;可以帮助我们发现隐藏在文本数据中的模式和结…

Docker概述 镜像-容器基本操作

Docker 概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足…

Redis应用(7)——Redis的项目应用(六):布隆过滤器---白名单 ----> Reids的问题,雪崩/ 击穿 / 穿透【重要】 布隆过滤器

目录 引出Redis的问题缓存雪崩&#xff1a;key不存在缓存击穿&#xff1a;热点key缓存穿透【重要】 穿透的解决方案&#xff1a;布隆过滤器问题&#xff1a;如何存储100w纯数字布隆过滤器项目应用&#xff1a;布隆过滤器≈白名单htool工具包案例 Redis项目应用&#xff08;六&a…

OpenCV4图像处理-图像交互式分割-GrabCut

本文将实现一个与人&#xff08;鼠标&#xff09;交互从而分割背景的程序。 GrabCut 1.理论介绍2. 鼠标交互3. GrabCut 1.理论介绍 用户指定前景的大体区域&#xff0c;剩下为背景区域&#xff0c;还可以明确指出某些地方为前景或者背景&#xff0c;GrabCut算法采用分段迭代的…

蓝桥杯专题-真题版含答案-【星系炸弹】【隔行变色】【手链样式】【生日蜡烛】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

Python爬虫-进入浏览器控制台就出现无限debugger,怎么解决?

前言 本文是该专栏的第53篇,后面会持续分享python爬虫干货知识,记得关注。 对于控制台出现无限debugger的情况,笔者之前在“JS逆向-常见反调试之“无限Debugger”,怎么解决?”里面有详细介绍过。而本文,针对控制台调试出现无限debugger的另一种情况,笔者来详细介绍该问…

C语言的自定义类型(结构体、枚举、联合体)

“虽然前方拥堵&#xff0c;但您仍在最优路线上” ——高德地图 文章目录 一、结构体类型 1.结构体类型的定义 2.结构体变量的初始化 3.结构体类型变量的定义 4.结构体内存对齐 5.结构体实现位段 二、枚举类型 三、联合体类型 大家好&#xff0c;我是纪宁。 这篇文章主…

【数据结构】--八大排序算法【完整版】

匠心制作&#xff0c;后续有问题会加以修改的 &#xff0c;全文均是自己写的&#xff0c;几张图有参考网络 ———————————————— 目录 一、直接插入排序 二、希尔排序(直接插入排序的改良版) 三、选择排序&#xff08;直接选择排序&#xff09; 四、堆排序 …

通过YOLOV5实现:王者荣耀百里守约自瞄

前期提要&#xff1a; 本文章仅供技术讨论使用。 关于如何通过YOLOV5去检测到王者中的敌方人物&#xff0c;在网上有很多相关的文章和教学视频我在这里就不过多的阐述&#xff0c;本篇文章主要讲的是在实现中比较难处理的一些技术点&#xff1a;如何获取高刷新率的手机屏幕、…

Hive 调优集锦(1)

一、前言 1.1 概念 Hive 依赖于 HDFS 存储数据&#xff0c;Hive 将 HQL 转换成 MapReduce 执行&#xff0c;所以说 Hive 是基于Hadoop 的一个数据仓库工具&#xff0c;实质就是一款基于 HDFS 的 MapReduce 计算框架&#xff0c;对存储在HDFS 中的数据进行分析和管理。 1.2 架…

贤鱼的刷题日常(数据结构链表学习)-1748:约瑟夫问题--题目详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;例题讲解1748:约瑟夫问题 ✅创作者&#xff1a;贤鱼 ⏰预计时间&#xff1a;15分钟 &#x1f389;个人主页&#xff1a;贤鱼的个人主页 &#x1f525;专栏系列&#xff1a;c &#x1f341;贤鱼的个人社区&#xff0c;欢迎你…

NLP实战8:图解 Transformer笔记

目录 1.Transformer宏观结构 2.Transformer结构细节 2.1输入 2.2编码部分 2.3解码部分 2.4多头注意力机制 2.5线性层和softmax 2.6 损失函数 3.参考代码 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学啊* 所有&#…

Okhttp-LoggingInterceptor的简单使用

概述 Okhttp除了提供强大的get,post网络请求外&#xff0c;还包含请求日志的拦截器&#xff0c;可以监视&#xff0c;重写&#xff0c;重试调用请求。 简单使用 我们在构造OkHttpClient时&#xff0c;通过addInterceptor()方法添加我们需要的过滤器。 object OkhttpUtils{……

SpringBoot知识范围-学习步骤【JSB系列之000】

语言视频选择收录专辑链接C张雪峰推荐选择了计算机专业之后-在大学期间卷起来-【大学生活篇】JAVA黑马B站视频JAVA部分的知识范围、学习步骤详解JAVAWEB黑马B站视频JAVAWEB部分的知识范围、学习步骤详解SpringBootSpringBoot知识范围-学习步骤【JSB系列之000】微信小程序详细解…