算法:动态规划

news2024/12/26 11:34:54

目录

🍉什么是动态规划?

1)题目解析,(我们以第N个泰波那契数来进行举例)

2)解读算法原理

🍉第N个泰波那契数的代码编写

🍉空间优化


🍉什么是动态规划?

动态规划就是一种解决题目的总体思路,在秋招和春招的时候会有很多面试题都会用到动态规划的求解思路,我们就来仔细的学习以下~

1)题目解析,(我们以第N个泰波那契数来进行举例)

2)解读算法原理

🍒1.状态表示

什么是状态标识?我们先来问问chatGPT,得到以下解释:

在动态规划中,状态表示指的是如何表示子问题的状态。这些状态通常用变量或数组来表示,并且它们存储着问题的某种属性或者是解的部分信息。

具体的状态表示方法取决于问题的特点和要求。一般来说,状态表示应该满足以下两个条件:

  1. 无后效性:即一个状态的值只与前面的状态有关,与未来的状态无关。这意味着在计算每个状态时,不需要考虑当前状态之后的任何状态。这样可以简化计算过程并减小时间复杂度。
  2. 最优子结构:即全局最优解包含了各个子问题的最优解。这意味着通过计算子问题的最优解,可以推导出整个问题的最优解。

常见的状态表示方式包括但不限于:

  • 单个变量:例如表示位置、时间等。
  • 数组:例如表示数量、容量等。
  • 矩阵:多维数组,用于表示相关的状态。

在动态规划问题中,选择合适的状态表示方法对于问题的求解至关重要。通过合理的状态表示,可以将复杂的问题转化为易于理解和计算的子问题,从而提高求解效率

简单来说:

我们会建立一个一维数组,我们称为dp表,然后我们把这个dp表想办法填满,填满之后,里面的某个值可能就是我们的最终结果,状态表示就是指,dp表里面的值所表示的含义

怎么来?

  • 1.题目要求——dp[i]表示:第i个泰波那契数的值
  • 2.经验+题目要求(多做题就会有所体会)
  • 3.分析问题的过程中,发现重复子问题

🍒2.状态转移方程(最难的一步)

这个通过读题就可以看出,题目中已经告诉了我们:

dp[i] = dp[i-1] + dp[i-2] + dp[i-3] 

具体如何推导,我们之后慢慢做题来看

🍒3.初始化

初始化的时候保证填表不越界,

比如泰波那契数这个题,我们要填表中的前三个,按公式来说我们就要直到第-3,-2,-1个位置
但这样肯定是越界的,所以我们要根据题目推出来。而这个题就已经给了我们前三个位置的数,分别为:0,1,1

 🍒4.填表顺序

为了填写当前状态的时候,所需要的状态已经计算过了

在这道题里,我们的填表顺序是从左到右

🍒5.返回值

题目要求 + 状态表示

🍉第N个泰波那契数的代码编写

题目链接:力扣

class Solution {
public:
    int tribonacci(int n) 
    {
        // 1.创建 dp 表
        // 2. 初始化
        // 3. 填表
        // 4. 返回值

        if(n == 0) 
            return 0;
        if(n == 1 || n == 2) 
            return 1;

        vector<int> dp(n + 1);
        dp[0] = 0,dp[1] = 1,dp[2] = 1;
        for(int i = 3; i <= n; i++)
            dp[i] = dp[i-1] + dp[i-2] + dp[i-3];
        return dp[n];
    }
};

🍉空间优化

空间优化方法会在这道题和很后面学的背包问题中进行讲解

主要是因为我们刚刚接触到动态规划,先要把重点放在前五个步骤上面
(1.状态表示;2.状态转移方程;3.初始化;4.填表顺序;5.返回值)

空间优化会着重在背包问题的文章中重点讲解

我们先来了以这道题来了解以下空间优化

我们可以用到滚动数组的方法来进行优化

我们在求某一个状态的时候,仅仅只需要直到前面的三种状态即可,
我们在求 n=4 的时候,就不会在用到0位置的数,我们在求 n=5 的时候就不会用到 0和 1位置的值所以我们在求后面的数的时,只需要前面若干个数的时候,就可以用滚动数组来求解

其时间复杂度:优化前时O(n^2),优化后时O(n);优化前时O(n),优化后时O(1)

🍒解决该题的思路:

定义四个变量,每次对其进行更新操作

注意一个细节,我们注意赋值的顺序!

class Solution {
public:
    int tribonacci(int n) 
    {
        // 1.创建 dp 表
        // 2. 初始化
        // 3. 填表
        // 4. 返回值
        if(n == 0) 
            return 0;
        if(n == 1 || n == 2) 
            return 1;

        int a = 0, b = 1, c = 1, d = 0;
        for(int i = 3; i <= n; i++)
        {
            d = a + b + c;
            // 滚动操作
            a = b;
            b = c;
            c = d;
        }
        return d;
    }
};

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

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

相关文章

全国青少年信息素养大赛参赛练习题2

海龟画图: 漂亮的螺旋线 import turtle as tt.bgcolor("black") n=6 colors = [red, green, blue, yellow,orange,purple]for x in range(160):t.pencolor(colors[x%6])t.forward(x*5/n+x)t.left(360/n+1)t.width(x*n/200) t.up() t.left(-90) t.forward(50) t.d…

什么是番茄工作法?

基本概念 番茄工作法是由弗朗西斯科西里洛于1992年创立的一种相对于GTD更微观的时间管理方法&#xff0c;旨在帮助使用者尽可能保持专注以及创造力&#xff0c;从而更快地完成工作并减少心理疲劳。 使用番茄工作法&#xff0c;首先要选择一个待完成的任务&#xff0c;然后将番茄…

5.2 Python高级特性之---切片迭代

一、 切片 一般用于提取指定区间内的内容&#xff0c;常用于&#xff1a;str、list、tuple等类型的的局部变量&#xff0c;如下为具体案例1、 【列表切片】 res_list [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]1&#xff09; 无步长: …

Redis的数据淘汰策略了解吗?

面试官&#xff1a;Redis数据淘汰策略了解吗&#xff1f; 我&#xff1a;知道。嗯~~ 当Redis中的内存不够用时&#xff0c;此时再向Redis中添加新的key&#xff0c;Redis就会按照某种规则将内存中的数据删除掉。这种数据的删除规则被称为内存的淘汰策略。 面试官&#xff1a;…

【机器学习】吴恩达课程1-Introduction

一、机器学习 1. 定义 计算机程序从经验E中学习&#xff0c;解决某一任务T&#xff0c;进行某一性能P&#xff0c;通过P测定在T上的表现因经验E而提高。 2. 例子 跳棋程序 E&#xff1a;程序自身下的上万盘棋局 T&#xff1a;下跳棋 P&#xff1a;与新对手下跳棋时赢的概…

深度强化学习经验回放(Experience Replay Buffer)的三点高性能修改建议:随机采样、减少保存的数据量、简化计算等

高性能的 ReplayBuffer 应该满足以下三点: 随机采样 random sample 的速度要快,尽可能加快读取速度(最为重要)减少保存的数据量,增加吞吐效率(对分布式而言重要)保存能简化计算的变量(对特定算法而言重要)为了达成以上要求,我建议做出以下修改: 把 Replay Buffer 的…

【从零到Offer】反射那些事

什么是反射&#xff1f; ​ 反射简单来说&#xff0c;就是在代码运行期间&#xff0c;通过动态指定任意一个类&#xff0c;从而构建对象&#xff0c;并了解该类的成员变量和方法&#xff0c;甚至可以调用任意一个对象的属性和方法。以String对象为例子&#xff0c;传统构造方式…

Go语言开发者的Apache Arrow使用指南:数据操作

在前面的Arrow系列文章中&#xff0c;我们介绍了Arrow的基础数据类型[1]以及高级数据类型[2]&#xff0c;这让我们具备了在内存中建立起一个immutable数据集的能力。但这并非我们的目标&#xff0c;我们最终是要对建立起来的数据集进行查询和分析等操作(manipulation)的。 在这…

RecycleView闪屏问题(java和ktolin解决)

问题案例&#xff1a;图库搜索界面点击空格&#xff0c;图片会闪烁两次显示 复现概率 通过布局看是通过RecycleView加载的&#xff0c;通过打印log并无异常闪烁是 notifyDataSetChange 造成的。由于适配器不知道整个数据集中的哪些内容已经存在&#xff0c;在重新匹配 ViewHol…

vscode remote-ssh配置

使用vscode的插件remote-ssh进行linux的远程控制。 在vscode上安装完remote-ssh插件后&#xff0c;还需要安装openssh-client。 openssh-client安装 先win R打开cmd&#xff0c;输入ssh&#xff0c;查看是否已经安装了。 如果没有安装&#xff0c;用管理员权限打开powershe…

LabVIEW将彩色图像转换到灰度图像

LabVIEW将彩色图像转换到灰度图像 在LabVIEW中使用许多图像处理工具的必要步骤之一是将其从彩色转换为单色。介绍一个开发的应用程序&#xff0c;用于基于LabVIEW软件环境&#xff0c;在所有支持的色彩空间&#xff08;RGB、HSI、HSV和HSL&#xff09;中自动将彩色图像转换为灰…

Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影

目录 1、Shi-Tomas角点检测 2、亚像素级别角点位置优化 3、ORB特征点 4、特征点匹配 5、RANSAC优化特征点匹配 6、相机模型与投影 1、Shi-Tomas角点检测 //Shi-Tomas角点检测 int test1() {Mat img imread("F:/testMap/lena.png");if (!img.data){cout <<…

Python结巴中文分词笔记

&#x1f4da; jieba库基本介绍 &#x1f310; jieba库概述 Jieba是一个流行的中文分词库&#xff0c;它能够将中文文本切分成词语&#xff0c;并对每个词语进行词性标注。中文分词是自然语言处理的重要步骤之一&#xff0c;它对于文本挖掘、信息检索、情感分析等任务具有重要…

2023年Java最新面试题

由【后端面试题宝典】提供 和 equals 的区别是什么&#xff1f; 对于基本类型&#xff0c;比较的是值&#xff1b;对于引用类型&#xff0c;比较的是地址&#xff1b;equals不能用于基本类型的比较&#xff1b;如果没有重写equals&#xff0c;equals就相当于&#xff1b;如果重…

带记忆的Transformer模块

MEMORIZING TRANSFORMERS 返回论文和资料目录 论文地址 1.导读 谷歌去年做的一个工作。内容很简单&#xff0c;在Transformer模块中加入了一层记忆层&#xff0c;结果表明这个方法可以帮助模型提高在NLP任务上的表现&#xff1a;generic webtext (C4), math papers (arXiv),…

C# IEnumerator 用法

一、概述 IEnumerator 是所有非泛型枚举器的基接口。 其泛型等效项是 System.Collections.Generic.IEnumerator<T> 接口。 C# 语言的 foreach 语句&#xff08;在 Visual Basic 中为 for each&#xff09;隐藏了枚举数的复杂性。 因此&#xff0c;建议使用 foreach 而不…

掘金量化—Python SDK文档—1.快速开始

掘金量化终端是一款为专业量化投资打造的功能齐备的落地式终端&#xff0c;集成了策略开发到实盘的模块化功能&#xff0c;打通研究、仿真和绩效链路、兼容多种编程语言&#xff0c;易于使用、性能可靠&#xff0c;能够帮助量化投资者提高策略开发效率、减少 IT 投入。 掘金量…

AI 智能对话 - 基于 ChatGLM2-6B 训练对话知识库

前情提要 怎么将 AI 应用到工作中呢&#xff1f;比如让 AI 帮忙写代码&#xff0c;自己通过工程上的思维将代码整合排版&#xff0c;我挺烦什么代码逻辑严谨性的问题&#xff0c;但是我又不得不承认这样的好处&#xff0c;我们要开始将角色转换出来&#xff0c;不应该是一个工…

Understanding Cascade Left Joins and Writing Complex Queries

文章目录 a left join b left join cuser casesql query execution order In SQL, the left join is a powerful tool for combining data from multiple tables based on a common column. In this blog post, we will explore the concept of cascade left joins, providing …