当前位置: 首页 > news >正文

算法:动态规划的入门理解

文章目录

  • 算法原理
  • 题目解析
    • 第n个泰波那契数列
    • 三步问题
    • 使用最小花费爬楼梯

从本篇开始总结的是动态规划的一些内容,动态规划是算法中非常重要的一个版块,因此也是学习算法中的一个重点,在学习动态规划前应当要把动态规划的基础知识学习一下

算法原理

动态规划既然是一个新的算法,这个名字也是新名字,那么就要首先明确这个算法的名字代表什么含义

动态规划是什么?
动态规划其实就是dp表中的值所表示的含义

那什么又是dp表?
dp表是解决这类问题中必须要使用的一个内容,通常是借助vector来表示

dp表怎么写出来?
一般来说题目要求中会有一些提示,同时在分析问题的过程中,如果遇到了分析的过程中有重复的子问题,也可以借助这个逻辑写出一个状态转移方程,利用这个状态转移方程就可以填写到dp表

状态转移方程
状态转移方程就是在动态规划中根据一部分提示找到dp表的填入方法,再根据这个方法就可以借助dp表解决问题,因此状态转移方程是解决问题的关键

题目解析

首先用一个比较简单的题目来上手动态规划

第n个泰波那契数列

在这里插入图片描述

对于这个题来说,可以用上面的动态规划的方法来处理:

首先创建一个dp表,再从题目中找到状态转移方程,再利用状态转移方程写入dp表,再利用dp表求出要找的数据

class Solution 
{
public:int tribonacci(int n) {// 处理边界if(n==0){return 0;}if(n==1 || n==2){return 1;}// 创建dp表vector<int> dp(n+1);// 初始化dp表dp[0]=0;dp[1]=1;dp[2]=1;//填入dp表for(int i=3;i<=n;i++){dp[i]=dp[i-1]+dp[i-2]+dp[i-3];}// 返回值return dp[n];}
};

三步问题

在这里插入图片描述

分析问题:

假设现在有1个台阶,那么小孩跳到这个台阶的方法有1种,直接从地面走到第一个台阶上

假设现在有2个台阶,那么小孩跳到这个台阶的方法有2种,第一种从地面直接走到第二个台阶上,第二种是小孩从地面走到第一个台阶,再从第一个台阶走到第二个台阶上

假设现在有3个台阶,那么小孩跳到这个台阶的方法有4种,第一种直接跳到第三个台阶上,第二种先跳到第一个台阶,再从第一个台阶向第三个台阶跳,而从第一个台阶向第三个台阶跳又有两种,参考有2个台阶的方案,那么总共第二种方法有2种,第三种小孩跳到第二个台阶,再从第二个台阶跳到第三个台阶,因此总共有四种方法

假设现在有4个台阶,那么小孩跳到第四个台阶的方法总共有7种,先让小孩走到第一个台阶,再从第一个台阶走到第四个台阶即可,而小孩走到第一个台阶的方法有1种;也可以先让小孩走到第二个台阶,再从第二个台阶走到第四个台阶,而小孩走到第二个台阶的方法有2种;先让小孩走到第三个台阶,再从第三个台阶直接到第四个台阶,而直接让小孩走到第四个台阶的方法有4种,因此上面的这些总计是7种

假设现在有5个台阶,那么小孩跳到第五个台阶的方法有13种,先让小孩跳到第二个台阶,再从第二个台阶直接到第五个台阶…

因此规律就找到了,其实就是一个斐波那契数列的变形问题,利用上面的例题的思路就可以解决这个问题

class Solution 
{
public:int waysToStep(int n) {vector<long long> dp(n+4);dp[0]=0;dp[1]=1;dp[2]=2;dp[3]=4;for(int i=4;i<=n;i++){dp[i]=dp[i-1]+dp[i-2]+dp[i-3];dp[i] %= 1000000007;}return dp[n];}
};

使用最小花费爬楼梯

在这里插入图片描述
此题也是动态规划中的一个典型题,这里从两个角度来看这道题

从最开始的介绍中可以知道,对于动态规划的问题来说,关键是dp[i]的意义和状态转移方程,在解决问题的过程中要优先对这两个部分进行思考和解决,那么两个不同的dp[i]的角度来看这个题

首先从第一个角度来看:

如果这里的dp[i]表示的是,上到第i个台阶需要花费多少钱:
那么可以这样思考问题,要知道上到第i个台阶需要多少钱,就必然要知道上到第i-1个台阶要花多少钱,再用这个钱加上上第i-1个台阶要花多少钱,由于一次可以上两个台阶,因此也要知道上到第i-2个台阶需要多少钱和上这个台阶需要多少钱,再比较一下从第i-1个台阶上划算还是从第i-2个台阶上划算,比较后就可以得到dp[i]的值,因此状态转移方程就很容易得到了

dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])

此时注意一下边界初始化问题:在第0和第1个台阶是不需要花钱的,于是初始化为0即可,代码也可以很好的实现出来

class Solution 
{
public:int minCostClimbingStairs(vector<int>& cost) {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()];}
};

以上为第一种思考的方式,dp[i]对应的意义还有其他,这里还可以理解为从第i个位置上到最顶上需要的花费,因此这里也可以借助这个意义来解决

那如果要求从第i个台阶上到顶端要花多少钱,需要知道从第i个台阶一次上一个台阶还是一次上两个台阶比较划算,因此这里又需要知道i+1和i+2的值,根据这两个的值决定一次上一个台阶还是上两个台阶,因此状态转移方程也可以得出来了:

dp[i]=min(dp[i+1]+cost[i],dp[i+2]+cost[i]);

那么代码的实现也可以得出:

class Solution 
{
public:int minCostClimbingStairs(vector<int>& cost) {int n=cost.size();vector<int> dp(n);dp[n-1]=cost[n-1];dp[n-2]=cost[n-2];for(int i=n-3;i>=0;i--){dp[i]=min(dp[i+1]+cost[i],dp[i+2]+cost[i]);}return min(dp[0],dp[1]);}
};

相关文章:

算法:动态规划的入门理解

文章目录 算法原理题目解析第n个泰波那契数列三步问题使用最小花费爬楼梯 从本篇开始总结的是动态规划的一些内容&#xff0c;动态规划是算法中非常重要的一个版块&#xff0c;因此也是学习算法中的一个重点&#xff0c;在学习动态规划前应当要把动态规划的基础知识学习一下 算…...

最新版nacos 2.2.3服务注册与发现版本依赖问题

最新版nacos的注册服务时配置文件写的是对的&#xff0c;但就是在nacos web页面无法看见服务&#xff0c;此时你需要注意你的依赖是否正确 spring: application:name: orderservicecloud:nacos:discovery:server-addr: 122.51.115.127:8848父工程依赖&#xff1a;现在最新的s…...

2023年中国合同能源管理行业研究报告

第一章 行业概况 1.1 定义及分类 合同能源管理 (Energy Performance Contracting, EPC) 是当前能源行业中一个重要的概念&#xff0c;它构建了一个桥梁&#xff0c;将节能服务公司 (Energy Management Company, EMCo) 与用能单位紧密联系在一起。通过特定的契约形式&#xff…...

php以半小时为单位,输出指定的时间范围

//可预订小时范围$hour [];for ($i$startHour*3600;$i<$endHour*3600;$i1800){//以半小时为单位输出$startHourItem date(H:i,strtotime(date(Y-m-d))$i);//小时开始$endHourItem date(H:i,strtotime(date(Y-m-d))$i1800);//当前时间再加半小时$hourItemStr $startHourI…...

Electron应用的 asar 打包 解压

前言&#xff1a; .asar文件是一种归档文件格式&#xff0c;通常用于封装Electron应用程序的资源。Electron是一个使得开发者能够使用Web技术构建跨平台桌面应用程序的框架。为了提高性能和简化部署&#xff0c;Electron应用程序的资源通常会被打包到一个.asar文件中。 安装 as…...

蓝桥等考Python组别十七级003

第一部分:选择题 1、Python L17 (15分) 运行下面程序,输出的结果是( )。 def func(x, y): return (x + y) // 3 print(func(7, 5)) 2468正确答案:B 2、Python L17 (15</...

Redis概述和与SpringBoot的整合

Redis是一种高性能的键值对存储数据库&#xff0c;它支持多种数据结构&#xff0c;包括字符串、哈希、列表、集合和有序集合等。Redis具有快速、可靠、灵活和可扩展等特点&#xff0c;也被广泛应用于缓存、队列和排行榜等场景。 SpringBoot是一种基于Spring框架的快速开发脚手…...

Python 中的 round() 函数:实现精确的数值舍入操作

round(x, n) 函数用于对数值 x 进行舍入操作&#xff0c;并指定保留的小数位数为 n。它的工作原理如下&#xff1a; 如果 x 的小数位数小于等于 n&#xff0c;则直接返回 x 本身。例如&#xff0c;round(3.1415, 2) 将返回 3.14。 如果 x 的小数位数大于 n&#xff0c;则按照四…...

在springboot中如何开启Bean数据校验

①&#xff1a;添加JSR303规范坐标与Hibernate校验框架对应坐标 <dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId> </dependency><dependency><groupId>org.hibernate.validator<…...

【C语言好题系列三】

文章目录 学习导航一. 选择题二. 编程题(力扣/牛客网&#xff09;三. 总结 学习导航 一. 选择题 如下程序的运行结果是&#xff08;D&#xff09; char c[5]{a, b, \0, c, \0}; printf("%s", c);A: ‘a’ ‘b’ B: ab\0c\0 C: ab c D: ab 答案解析&#xff1a; 正…...

ElasticSearch搜索引擎:常用的存储mapping配置项 与 doc_values详细介绍

一、ES的数据存储结构&#xff1a; ES底层使用 Lucene 存储数据&#xff0c;Lucene 的索引包含以下部分&#xff1a; A Lucene index is made of several components: an inverted index, a bkd tree, a column store (doc values), a document store (stored fields) and te…...

[Spring]事务的传播机制

一、背景 Mysql在修改完数据后&#xff0c;默认会自动触发事务Commit提交。 而在我们服务的一个方法里&#xff0c;需要多次修改Mysql记录。 为了保证原子性&#xff0c;我们需要将Mysql设为手动提交&#xff0c;多次修改后再commit提交。 二、Spring事务 1、编程式事务管理…...

linux下,如何查看一个文件的哈希值md5以及sha264

在linux终端中&#xff0c;可能存在多个相似的文件&#xff0c;而哈希值可以唯一确定一个文件。文件的哈希值计算可以有以下两种方式&#xff0c;MD5和SHA256&#xff0c;现将两种方式罗列如下&#xff1a; 1、MD5 命令&#xff1a;$ md5sum FileName 一个文件的 MD5 是固定的…...

Java类加载过程

一、前言 我们都知道计算机的底层逻辑都是0和1的编码&#xff0c;当然除了现在所研究的量子计算除外。那么我们在计算机所做的一切操作&#xff0c;底层原理是不是都可以翻译到0和1呢。如果刨根问底的话&#xff0c;可以这么说&#xff0c;当然0和1的表示也属于逻辑门电路电的…...

人脸活体检测技术的应用,有效避免人脸识别容易被攻击的缺陷

随着软件算法和物理终端的进步&#xff0c;人脸识别现在越来越被广泛运用到生活的方方面面&#xff0c;已经成为了重要的身份验证手段&#xff0c;但同时也存在着自身的缺陷&#xff0c;目前常规人脸识别技术可以精准识别目标人像特征&#xff0c;并迅速返回比对结果&#xff0…...

大数据发展史

一、hadoop发展史 hadoop创始人Doug Cutting&#xff0c;主要为了实现Google类似全文搜索功能,该功能是基于Lucene框架进行优化升级,索引引擎; 2001年底Lucence成为Apache基金会的一个子项目,当时为了解决存储海量数据困难,检索海量速度慢,可以说Google是hadoop的思想之源; GFS…...

有关范数的学习笔记

向量的【范数】&#xff1a;模长的推广&#xff0c;柯西不等式_哔哩哔哩_bilibili 模长 范数 这里UP主给了说明 点赞 范数理解&#xff08;0范数&#xff0c;1范数&#xff0c;2范数&#xff09;_一阶范数-CSDN博客 出租车/曼哈顿范数 det()行列式 正定矩阵&#xff08;Posit…...

如何通过MES系统提高生产计划效率?

导 读 ( 文/ 1730 ) 在现代制造业中&#xff0c;通过制造执行系统&#xff08;MES&#xff09;系统来提高生产计划效率是至关重要的。本文将介绍如何通过MES系统来优化生产计划&#xff0c;包括实时数据分析、智能排程和协同协作。通过这些关键方法&#xff0c;企业可以提高生产…...

持续提升信息安全运维保障服务能力,天玑科技助力企业快速实现数字化转型

近年来&#xff0c;以互联网、云计算、大数据、物联网为代表的新一代信息技术快速发展。给人们的生产生活方式带来方便的同时&#xff0c;也给信息系统的安全带来了严峻的挑战。我国信息化和信息安全保障工作的不断深入推进&#xff0c;以应急处理、风险评估、灾难恢复、系统测…...

【PostgreSQL启动,停止命令(重启)】

找到 /usr/lib/systemd/system文件夹路径看是否包含 postgresql服务 关闭服务&#xff1a; systemctl stop postgresql-12.service启动服务 systemctl start postgresql-12.service重启服务 systemctl restart postgresql-12查看状态 systemctl status postgresql-12.servi…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...