【数据结构和算法】-动态规划爬楼梯

动态规划(Dynamic Programming,DP)是运筹学的一个分支,主要用于解决包含重叠子问题和最优子结构性质的问题。它的核心思想是将一个复杂的问题分解为若干个子问题,并保存子问题的解,以便在需要时直接利用,从而避免重复计算,提高算法效率。

原理

  • 动态规划算法将一个复杂的问题分解为若干个子问题,并保存每个子问题的解。当需要求解某个子问题时,如果之前已经求解过,则可以直接利用之前的解,从而避免重复计算。
  • 通过求解子问题的最优解来获得原问题的最优解。子问题的解通常存储在表格中,表格的行和列代表问题的不同阶段和状态。

基本步骤

  • 确定状态:首先,需要明确问题的状态表示。状态通常是与问题求解相关的变量的集合,它们的变化描述了问题的进展。
  • 状态转移方程:找到子问题之间的关系,并建立状态转移方程。状态转移方程描述了从一个状态转移到另一个状态所需的条件和结果。
  • 初始化边界条件:确定基本情况的解,为后续的状态转移提供依据。这通常涉及确定初始状态和某些特殊情况下的解。
  • 逐步推导:根据状态转移方程,从小规模问题开始逐步推导,直到求解出原问题的最优解。

应用场景

  • 动态规划算法适用于具有重叠子问题和最优子结构性质的问题。例如,背包问题、生产经营问题、资金管理问题、资源分配问题、最短路径问题等。
  • 在实际应用中,动态规划算法的效率通常比其他算法设计思想更高,特别是在问题规模较大的情况下。

实现方式

  • 动态规划算法可以用多种编程语言实现,如C++、Python等。实现时,需要定义一个表格来存储子问题的解,并根据状态转移方程逐步推导原问题的解。
  • 递推关系是从次小的问题开始到较大的问题之间的转化,因此动态规划往往可以用递归程序来实现。但由于递推可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,有递归不可比拟的优势。

三要素

  • 在确定动态规划算法时,最重要的是确定三个要素:问题的阶段、每个阶段的状态以及从前一个阶段转化到后一个阶段之间的递推关系。这三个要素共同构成了动态规划算法的基本框架。

背包问题实例

假设有一个背包,容量为V,现有n个物品,每个物品的重量为wi,价值为vi。要求在不超过背包容量的前提下,选取一些物品放入背包,使得背包中的物品总价值最大。

确定状态

首先我们的理解什么 是状态,状态被定义为:与问题求解相关的变量集合,描述了问题的进展。这是什么意思呢?
状态通常定义为一个二维数组 dp[i][j],其中 i 表示前 i 个物品,j 表示背包的容量为 j。dp[i][j] 表示在前 i 个物品中选择一些物品放入容量为 j 的背包中所能获得的最大价值。
这就是状态,状态就是某一时刻个体或系统的特定情况,而程序要做的就是用合适的数据结构来表示这种情况。我们可以画一个图:
在这里插入图片描述
当背包里有前3个物品时的状态:d[3][10] = 14,即放前三个物品在容量为10的包里,容量之和小于10,所以都能放下:在这里插入图片描述

状态转移方程

状态转移就是个体或者系统从一个前续状态通过什么方式或过程转变为后续状态
对于第 i 个物品,我们有两种选择:

  • 不选择第 i 个物品,那么 dp[i][j] 的值就等于 dp[i-1][j],即前 i-1个物品在容量为 j 的背包中的最大价值。
  • 选择第 i 个物品,那么 dp[i][j] 的值就等于 dp[i-1][j-w[i]] + v[i],其中 w[i] 是第 i 个物品的重量,v[i] 是第 i 个物品的价值。这表示在选择了第 i 个物品后,背包的剩余容量是j-w[i],我们需要从前 i-1 个物品中选择一些物品放入这个剩余容量的背包中,以获得最大的价值。

综合以上两种选择,我们得到状态转移方程:

dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])

注意:当 j < w[i] 时,无法选择第 i 个物品,因此 dp[i][j] 的值只能等于 dp[i-1][j]。

简单来说,就是不断的选择和组合,如果还有空间,那么就把新物体放进来,并判断新放入的物体的价值与未放入时的价值哪个大,取大的值:
在这里插入图片描述
上面的图是做示例,实际代码运算的过程并不是这样,上面的图大家看到容量已被沾满,但是价值并没有最大,那是因为我们只是按顺序放入,但并不是每一步都求解了最大价值。后面 大家看代再结合这个图来理解。

初始化边界条件
  • 当没有物品可选时(即 i = 0),无论背包容量 j 为多少,背包中的价值都为0,即 dp[0][j] = 0。
  • 当背包容量为0时(即 j= 0),无法放入任何物品,因此无论有多少物品可选,背包中的价值都为0,即dp[i][0] = 0。

这就是边界条件,边界条件是确定状态的范围。
最终我们得出的结果是:
在这里插入图片描述

代码实现

上代码:

/*** 动态规划求解背包问题* @param weights 重量* @param values  价值* @param v       背包容量* @return*/public static int cal(int[] weights,int[] values,int v){int iMax = weights.length;int jMax = v;//初始化二位数组 作为存储结果的矩阵int[][] dp = new int[iMax + 1][jMax + 1];for (int i = 1; i < iMax + 1; i++) {for (int j = 1; j < jMax + 1 ; j++) {if(weights[i-1] <= j){//空间足够dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-weights[i-1]]+values[i-1]);}else{//空间不够dp[i][j] = dp[i-1][j];}}}//返回矩阵右下角的值,即为最终结果return dp[iMax][jMax];}

上面就是代码实现,当然数据量大之后还要优化性能。代码很简洁,对吗?
是的,就是这么简单,但是理解起来可能对很多人是有困难的,这个时候大家可以自己画图,同时结合debug去跟代码,这样就能很好的去理解原理了,上一个辅助理解的图(其实就是个二维矩阵):
在这里插入图片描述

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

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

相关文章

【稳定检索】2024年核能科学与材料、物理应用国际会议(NESMPA 2024)

2024年核能科学与材料、物理应用国际会议 2024 International Conference on Nuclear Energy Science and Materials, Physical Applications 【1】会议简介 2024年核能科学与材料、物理应用国际会议即将拉开帷幕&#xff0c;这是一场汇聚全球核能科学、材料研究及物理应用领域…

文件上传漏洞简介

目录 漏洞原理 漏洞危害 利用场景 检测方法 防御方法 绕过手段 前端JS绕过 构造可解析后缀 修改Content-Type&#xff08;MIME&#xff09; 大小写绕过 文件头绕过 图片马 截断与特殊文件名 其他绕过 尝试绕过的步骤 漏洞原理 原理 攻击者构造恶意文件进行上传…

低调收藏,这份MobaXterm使用指南很全面

中午好&#xff0c;我的网工朋友。 MobaXterm&#xff0c;这个名字对于我们这些经常需要在Windows环境下与Linux服务器打交道的人来说&#xff0c;应该并不陌生。它不仅仅是一个SSH客户端&#xff0c;更是一个功能强大的终端工具箱&#xff0c;集成了X服务器和Unix命令集&…

醒图及国际版 v9.9.9/v3.9.0 解锁会员(让照片栩栩如生的神奇应用)

介绍 醒图App是一款专业的照片编辑工具&#xff0c;旨在帮助用户高效地处理和优化照片&#xff0c;使其更加引人注目。这款应用程序配备了多样化的功能&#xff0c;包括图像增强、滤镜应用以及色彩调整等&#xff0c;以满足各种编辑需求。其设计了一个直观的用户界面&#xff…

全球首例光伏电场网络攻击事件曝光

快速增长的光伏发电正面临日益严重的网络安全威胁。近日&#xff0c;日媒报道了首个针对光伏电场的网络攻击事件。 首例公开确认的光伏电网攻击 日本媒体《产经新闻》近日报道&#xff0c;黑客劫持了一个大型光伏电网中的800台远程监控设备(由工控电子制造商Contec生产的Solar…

ABS三星!IF:6.0+新刊,中科院2区SSCI,1个月左右见刊!OA无需版面费,领域权威期刊!

【欧亚科睿学术】 01 期刊基本概况 【期刊类型】管理类SSCI 【出版社】TAYLOR & FRANCIS出版社 【期刊概况】IF&#xff1a;6.0-7.0&#xff0c;JCR2区&#xff0c;中科院2区 【版面类型】正刊&#xff0c;仅10篇版面 【预警情况】2020-2024年无预警记录 【收录年份…

详解 HTML5 服务器发送事件(Server-Sent Events)

HTML5 服务器发送事件&#xff08;server-sent event&#xff09;允许网页获得来自服务器的更新。 EventSource 是单向通信的&#xff08;是服务器向客户端的单向通信&#xff0c;客户端接收来自服务器的事件流&#xff09;、基于 HTTP 协议&#xff08;EventSource 是基于标准…

TalkingData数据统计

一、简介 TalkingData是一家提供移动应用数据统计和分析的公司&#xff0c;专注于移动应用数据的收集、分析和可视化。TalkingData通过收集应用程序的用户行为数据&#xff0c;如应用下载量、用户留存率、用户活跃度等&#xff0c;帮助开发者了解用户行为趋势、优化应用功能、…

word 全文中 英文字体 和 样式的字体 莫名奇妙地 被改成 “等线”

word全文中英文字体和样式的字体莫名奇妙地被改成“等线” sm word又抽风了&#xff0c;改完论文保存后打开突然发现全文字体都不对劲&#xff0c;吓得冷汗直冒&#xff1a;虽然我用git管理了论文版本&#xff0c;但是只有比较大的修改我才上传了&#xff0c;刚刚修了几个小时…

React-useState

useState基础使用 useState是一个React Hook&#xff08;函数&#xff09;&#xff0c;它允许我们向组件添加一个状态变量&#xff0c;从而控制影响组件的渲染结果 本质&#xff1a;和普通JS变量不同的是&#xff0c;状态变量一旦发生变化组件的视图UI也会跟着变化&#xff0…

【哈希】闭散列的线性探测和开散列的哈希桶解决哈希冲突(C++两种方法模拟实现哈希表)(2)

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | Linux | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 哈希函数与哈希 之 哈希桶解决哈希冲突 的相关内容。 如果看到最后…

2024年5月份架构师考试真题完整版

截至2024-5-28 19:24:14已全部收录完成 共75到选择题&#xff0c;5道案例题&#xff0c;4道论文题。题目顺序不分先后。 全网最全的2024年5月份架构师考试真题回忆版&#xff0c;包含答案和解析。 群友 疯狂程序员 花落无声 半夏 鲁迅-三战老兵(预备役) 本次必成 锦鲤附体 2024…

超详细介绍基于微调 Faster R-CNN实现海上航拍图像中检测小物体-含源码与数据集免费下载

在航拍图像中检测小物体,尤其是对于海上救援等关键应用而言,是一项独特的挑战。及时检测水中的人可能意味着生死之间的差别。我们的研究重点是微调 Faster R-CNN(一种强大的两阶段物体检测器),以满足这一重要需求。 我们研究的核心是SeaDroneSee 数据集,这是一组重要的图…

618数码产品怎么选?四大必看推荐,自费无广测评

6.18盛宴即将开启&#xff0c;你是否已摩拳擦掌&#xff0c;准备在电商海洋中乘风破浪&#xff1f;然而&#xff0c;在繁多的商品和错综复杂的优惠面前&#xff0c;你是否感到些许迷茫&#xff1f;团团这位网购小能手&#xff0c;特地为大家梳理了一份精选购物清单。这些宝贝不…

sectigo企业通配符证书1590元13个月

通配符SSL证书可以同时保护多个域名站点&#xff0c;简化了用户管理SSL证书的流程&#xff0c;降低了管理成本&#xff0c;因此&#xff0c;不管是个人开发者还是企事业单位开发者都愿意尝试这款SSL证书产品。今天就随SSL盾小编了解Sectigo旗下的企业通配符SSL证书。 1.Sectig…

如何创建一个vue项目?详细教程,如何创建第一个vue项目?

已经安装node.js在自己找的到的地方新建一个文件夹用于存放项目&#xff0c;记住文件夹的存放路径&#xff0c;以我为例&#xff0c;我的文件夹路径为D:\tydic 打开cmd命令窗口&#xff0c;进入刚刚的新建文件夹 切换硬盘&#xff1a; D: 进入文件夹&#xff1a;cd tydic 使…

迈向F5G-A,开启全光万兆新时代——南通移动完成全市首个50G-PON技术验证

近日&#xff0c;南通移动在崇川区完成全市首个50G-PON万兆技术现网验证&#xff0c;标志着南通成为首批具备F5G-A(The 5th GenerationFixed Network-advanced)的万兆光网城市&#xff0c;使其成为网速最快、覆盖最全、时延最低的城市之一。 作为全光万兆的关键技术&#xff0c…

ScrumMaster认证机构及CSM、PSM、RSM价值比较

企业现有的经营管理模式和传统的瀑布式交付模式&#xff0c;已经不能适应快速变化的市场响应和客户需求&#xff0c;现代的敏捷工作方式在过去数年涌现&#xff0c;比如Scrum&#xff0c;XP&#xff0c;看板&#xff0c;DevOps等敏捷方法&#xff0c;近十年Scrum在国内企业中备…

近200个幼儿启蒙简笔画含步骤图含音频

其实早就想搞一下简笔画的相关数据&#xff0c;但奈何几乎所有简笔画类的数据中的图片都有大大的水印&#xff0c;今天正好遇到一个启蒙简笔画的数据&#xff0c;好的地方是&#xff1a;简笔画步骤都是4步&#xff0c;步骤都有说明&#xff0c;步骤图片没有水印&#xff0c;每个…

一款拥有15000+POC漏洞扫描工具

1 工具介绍 0x01 免责声明 请勿使用本文中所提供的任何技术信息或代码工具进行非法测试和违法行为。若使用者利用本文中技术信息或代码工具对任何计算机系统造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责。本文所提供的技术信息或代码工具仅供于学习&am…