数据结构与算法——动态规划算法简析

news2024/12/25 9:02:45

 1.初步了解动态规划

由于本篇博客属于动态规划的初阶学习,所以大多都是简单的表示,更深层次的学术用语会在之后深度学习动态规划之后出现,本文主要是带各位了解一下动态规划的大致框架 

1.1状态表示

通常的我们会开辟一个dp数组来存储需要表示的数据,其中dp[i]代指我们需要表示的位置,那么dp[i]的数据状态就是题目给出的限制条件,比如泰波那契数列中的第i个值或者最小花费爬楼梯的第i个台阶

1.2状态转移方程

通常的我们表示dp[i]位置的数据需要一定的公式,这种公式就是状态转移方程,比如泰波那契数列的第i个数是第i-3,i-2,i-1三个数之和,那么dp[i] = dp[i-3]+dp[i-2]+dp[i-1]就是泰波那契数列的状态转移方程,总的来说状态转移方程就是我们表示某一个特定位置需要遵循的规律

1.3初始化

一般来说在dp表中的前几个位置都是题目给出的,需要初始化用来表示后面的数据,这里依旧使用泰波那契数列举例,泰波那契数列的一开始三个位置的值分别为0、1、1,我们要用这三个值迭代求出第i(i>=4)个位置的值,那么初始化就要初始化dp表的前三个位置 

1.4填表顺序

一般来说填表都是逐个填表,不能跳跃某个位置,比如已知泰波那契数列的前三个位置的值就可以在第四个位置填表,但是如果在第五个位置填表就会出错,并且需要注意防止填表时越界,需要对边界情况特殊处理 

1.5返回值 

通常题目都会给出要求返回某个位置的值,比如给定某个变量n,求出第n个位置的值即可,需要具体题目具体讨论 

2.实战代码练习 

2.1题目解析

题目来源: 1137.第N个泰波那契数——力扣

测试用例

题目来源:746.最小花费爬楼梯——力扣

最小花费爬楼梯——牛客

测试用例

2.2算法原理

第N个泰波那契数

泰波那契数:目标位置前三个位置的和等于目标位置的值,前三个数为0/1/1

1.创建dp表,第n个泰波那契数就是dp表的第n+1个值,但是下标还是n

2.初始化前三个值

3.使用状态转移方程求出第n个泰波那契数

第N个泰波那契数——优化版本 

当需要求第i个位置的值就只需要保存i-1/i-2/i-3这三个位置的值即可,那么其他位置就会浪费,所以这里我们使用动态数组进行优化,即

1.只创建三个变量a/b/c作为滚动数组,使用d来存储第i个泰波那契数

2.不断将三个变量向后移动直到求出第n个泰波那契数,返回d即可

最小花费爬楼梯

已知需要爬到楼顶,而楼顶代表的是数组末尾数字的下一个位置,即n+1个位置,所以创建一个dp表返回到dp[n]位置的最小花费即可

1.因为每次只能走两步,所以第i个位置的最小花费就是第i-1与第i-2两个位置的较小值,那么我们就得到了状态转移方程dp[i]=min(cost[i-1]+dp[i-1],cost[i-2]+dp[i-2])

2.最终填表完成后直接返回dp[n]就代表第n+1个位置的值也就是到楼顶的最小花费

2.3代码展示

 第N个泰波那契数

class Solution {
public:
    int tribonacci(int n) 
    {
        //创建dp表
        vector<int> dp(n + 1);
        //初始化
        dp[0] = 0;
        dp[1] = dp[2] = 1;
        //处理边界情况
        if(n == 0)
        {
            return 0;
        }
        if(n == 1 || n == 2)
        {
            return 1;
        }
        //状态表示方程
        for(int i = 3;i <= n;i++)
        {
            dp[i] = dp[i-1] + dp[i-2] + dp[i-3];
        }
        return dp[n];
    }
};

 第N个泰波那契数——优化版本

class Solution {
public:
    int tribonacci(int n) 
    {
        int a = 0,b = 1, c = 1;
        int d = 0;
        if(n == 0)
        {
            return 0;
        }
        if(n == 1 || n == 2)
        {
            return 1;
        }
        //滚动数组
        for(int i = 3;i <= n;i++)
        {
            d = a + b + c;
            a = b;
            b = c;
            c = d;
        }
        return d;
    }
};

 最小花费爬楼梯

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) 
    {
        int n = cost.size();
        //创建dp表
        vector<int> dp(n + 1);
        //初始化
        dp[0] = dp[1] = 0;
        //状态转换方程
        for(int i = 2;i <= n;i++)
        {
            dp[i] = min(dp[i - 1] + cost[i - 1],dp[i - 2] + cost[i - 2]);
        }

        return dp[n];
    }
};

 

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

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

相关文章

centos7 yum仓库无法使用的问题

1、问题 如下 2、按照csdn等网页说的做了没有用&#xff01;CentOS-yum源不可用报错&#xff1a;Could not retrieve mirrorlist 问题解决_yum could not retrieve mirrorlist-CSDN博客 3、使用b站博主的方法解决&#xff01; LinuxMirrors: GNU/Linux 一键更换系统软件源脚本…

切片辅助超推理-sahi库-slice_image使用

代码地址&#xff1a;https://github.com/obss/sahi slice_image是sahi库中一个函数&#xff0c;理解这个函数是理解切片的入口。 一、官方函数使用示例 from sahi.slicing import slice_imageimage_pathrsmall-vehicles1.jpeg output_dirrashi_result output_file_name1-#手…

LeetCode 3311. 构造符合图结构的二维矩阵

LeetCode 3311. 构造符合图结构的二维矩阵 给你一个二维整数数组 edges &#xff0c;它表示一棵 n 个节点的 无向 图&#xff0c;其中 edges[i] [ui, vi] 表示节点 ui 和 vi 之间有一条边。 请你构造一个二维矩阵&#xff0c;满足以下条件&#xff1a; 矩阵中每个格子 一一对应…

力扣之1336.每次访问的交易次数

题目&#xff1a; sql建表语句&#xff1a; Create table If Not Exists Visits (user_id int, visit_date date); Create table If Not Exists Transactions (user_id int, transaction_date date, amount int); Truncate table Visits; insert into Visits (user_id,…

如何让客户主动成为你的品牌大使

在销售领域&#xff0c;转介绍被公认为一把无坚不摧的利器&#xff0c;它不仅铸就了高成交率的辉煌&#xff0c;更以惊人的速度缩短了成交周期。一位精通转介绍艺术的销售员&#xff0c;其业绩自然熠熠生辉&#xff0c;工作之路亦显得游刃有余。 然而&#xff0c;面对这一宝藏…

Bianchi模型、python计算及ns3验证_关于2~10 STA验证的补充

首先就是预设修改, NS3中bitrate是OfdmRate54Mbps,STA数目我设置了2-10,ack长度是14bytes,数据长36,头36(trace中只有1536和14两个长度,也就是数据长度1500,头36,ack14),SIFS和SLOT是16us和9us(在phy的定义中,11a的时候,sifs是16,slot是9),difs是34us(在bia…

2024Java最新面试题总结(针对于一些小厂、中厂)

这是根据个人面试经历总结出来的一些经验希望可以帮助到有需要的人。 面试的时候&#xff0c;会先让你进行自我介绍&#xff0c;这个大家准备一两分钟的面试稿就可以。然后就是正式面试&#xff0c;面试官一般是两个人以上&#xff0c;开始&#xff0c;面试官会先提问一些基本…

【NLP自然语言处理】01-基础学习路径简介

目的&#xff1a;让大家能够在 AI-NLP 领域由基础到入门具体安排&#xff1a; NLP介绍 文本预处理RNN 及其变体&#xff08;涉及案例&#xff09;Transformer 原理详解迁移学习 和 Bert 模型详解 &#xff08;涉及案例&#xff09;特点&#xff1a; 原理 实践每个文章会有练习…

Nat. Commun.:飞秒激光书写受蚂蚁启发的可重构微型机器人集体

背景介绍生物在各种环境中的集体行为十分普遍&#xff0c;它们能够自发有序地完成单个个体难以完成的任务。目前&#xff0c;生物集体的形成主要分为两大类。第一类生物个体之间没有直接接触&#xff0c;如蜜蜂、鱼和鸟类&#xff0c;这导致这些集体不稳定&#xff0c;容易受到…

Ubuntu24 Firefox和Window Firefox同步问题

由于平常开发在Ubuntu系统&#xff0c;但是日常学习查资料又在Window系统&#xff0c;查资料保存网页到浏览器中时&#xff0c;经常遇到两个平台标签同步问题&#xff0c;希望可以选一个支持Ubuntu、Window的浏览器。 选用Google Chrome浏览器&#xff0c;确实挺好用&#xff…

微服务seata解析部署使用全流程

官网地址&#xff1a; Seata 是什么&#xff1f; | Apache Seata 1、Seata术语 用来管理分布式事务&#xff0c;由阿里巴巴出品。 【1、TC (Transaction Coordinator) - 事务协调者】 用来维护事务的&#xff0c;包括主事务和分支事务。 【2、TM (Transaction Manager) - …

TCP与UDP协议(三次握手四次挥手)

TCP与UDP 简介TCP和UDP一、TCP1.1 TCP的三次握手问题来了&#xff1a;为啥是三次握手而不是两次呢&#xff1f; 1.2建立连接后的通信过程&#xff08;丢包与乱序问题&#xff09;1.3四次挥手问题来了&#xff1a;为什么要四次挥手&#xff1f; 二、UDP 简介TCP和UDP TCP、UDP都…

机器学习笔记(持续更新)

重复值处理&#xff1a; 重复值处理代码&#xff1a; import pandas as pd data pd.DataFrame({学号: [1, 2, 3, 4, 5, 6, 7, 7, 8],身高: [172,162,175,170,168,160,164,164,160],体重: [70,62,75,68,67,58,64,64,53] }) data.drop_duplicates([学号], keep last, inplaceT…

SQL第13课挑战题

1. 使用inner join&#xff0c;以检索每个顾客的名称&#xff08;customers表中的cust_name&#xff09;和所有的订单号&#xff08;orders表中的order_num). 2. 修改第一题&#xff0c;仅列出所有顾客&#xff0c;及时他们没有下过订单。 3. 使用outer join联结products表和or…

【Easy RL】Easy RL蘑菇书全书学习笔记

【Easy RL】Easy RL蘑菇书全书学习笔记 第一章 强化学习基础1.1 强化学习概述监督学习强化学习与监督学习的不同之处二者的区别总结强化学习的特征强化学习的优越性预演&#xff08;rollout&#xff09;和 轨迹&#xff08;trajectory&#xff09;的概念端到端的概念深度强化学…

BurpSuite内置浏览器打不开(实用解决法/简便)

也不知道出现了什么问题就是莫名其妙的内置浏览器打不开&#xff0c;有时候不想配置代理很麻烦&#xff0c;这里实用的解决办法. 任务一 报错情况&#xff08;反正也看不懂&#xff09; 任务二 我们先去尝试打开这个运行模式&#xff0c;然后我们再去重试&#xff0c;如果还是打…

【重学 MySQL】五十九、二进制字符串类型与 JSON 类型

【重学 MySQL】五十九、二进制字符串类型与 JSON 类型 二进制字符串类型JSON类型 在MySQL数据库中&#xff0c;二进制字符串类型与JSON类型各自具有独特的特点和用途。 二进制字符串类型 二进制字符串类型在MySQL中主要用于存储二进制数据。这类数据类型包括BINARY、VARBINAR…

使用 ChatGPT Canvas 辅助 ABAP 开发

ChatGPT Canvas 是最近 OpenAI 推出的一个新功能,它不仅仅是一个简单的聊天对话式窗口。 Canvas 旨在扩展 ChatGPT 平台的功能,超越简单的问答交互。 Canvas 可以在单独的窗口中打开专用工作区,用户能够更直观、更高效地与 ChatGPT 在复杂的写作或者编码项目进行协作。 有…

Nginx08-反向代理

零、文章目录 Nginx08-反向代理 1、概述 关于正向代理和反向代理&#xff0c;我们在前面已经介绍过了&#xff0c;简而言之就是正向代理代理的对象是客户端&#xff0c;反向代理代理的是服务端&#xff0c;这是两者之间最大的区别。 Nginx即可以实现正向代理&#xff0c;也可…

【Unity】版本不一致且未升级资产,导致 Unity Sprite 2D 动画播放错误

自己的 Unity版本是 2022.3.45f1。目前折腾的这插件 2D Action RPG Engine: Mythril2D &#xff0c;推荐使用的 Unity 版本是 2021.3.18。 倒腾了这个 unity animation 动画半天&#xff0c;发现这个 animation sprite resolver 在导入动画帧的时候&#xff0c;一直都导入的是…