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

news2024/11/18 13:55:34

动态规划(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.coloradmin.cn/o/1713228.html

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

相关文章

15.Redis之持久化

0.知识引入 mysql的事务,有四个比较核心的特性. 1. 原子性 2.一致性 3.持久性 >(和持久化说的是一回事)【把数据存储在硬盘 >持久把数据存储茌内存上>不持久~】【重启进程/重启主机 之后,数据是否存在!!】 4.隔离性~ Redis 是一个 内存 数据库.把数据存储在内存中的…

运维必备的 Linux文件系统

1 前言 我们来简单看一下Linux系统的磁盘、目录、文件。 2 Linux 文件系统 在 Linux 操作系统中&#xff0c;所有被操作系统管理的资源&#xff0c;例如网络接口卡、磁盘驱动器、打印机、输入输出 设备、普通文件或是目录都被看作是一个文件。 也就是说在 Linux 系统中有…

长文总结 | Python基础知识点,建议收藏

测试基础-Python篇 基础① 变量名命名规则 - 遵循PEP8原则 普通变量&#xff1a;max_value 全局变量&#xff1a;MAX_VALUE 内部变量&#xff1a;_local_var 和关键字重名&#xff1a;class_ 函数名&#xff1a;bar_function 类名&#xff1a;FooClass 布尔类型的变量名…

21天精通FL Studio21.2.8!中文汉化全攻略方法教程

在音乐制作的世界中&#xff0c;有一款软件以其强大的功能和易用性而广受好评&#xff0c;那就是FL Studio。而最新版本的FL Studio 21更是在原有的基础上进行了全面的升级&#xff0c;为我们带来了更多的惊喜。今天&#xff0c;我们就一起来了解一下这款最新的水果软件——FL …

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

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

超分论文走读

codeFormer 原始动机 高度不确定性&#xff0c;模糊到高清&#xff0c;存在一对多的映射纹理细节丢失人脸身份信息丢失 模型实现 训练VQGAN 从而得到HQ码本空间作为本文的离散人脸先验。为了降低LQ-HQ映射之间的不确定性&#xff0c;我们设计尽量小的码本空间和尽量短的Code…

文心智能体:基于零代码平台的智能体开发与应用

文章目录 初识文心智能体文心智能体平台优势文心智能体平台功能 创建文心智能体总结 初识文心智能体 文心智能体平台是基于文心大模型的智能体构建平台&#xff0c;为开发者提供低成本的开发方式&#xff0c;支持广大开发者根据自身行业领域、应用场景&#xff0c;采用多样化的…

isscc2024 short course4 In-memory Computing Architectures

新兴的ML加速器方法&#xff1a;内存计算架构 1. 概述 内存计算&#xff08;In-memory Computing&#xff09;架构是一种新兴的机器学习加速器方法&#xff0c;通过将计算能力集成到存储器中&#xff0c;以减少数据移动的延迟和能耗&#xff0c;从而提高计算效率和性能。这种方…

用于癌症免疫治疗的自佐剂聚胍纳米疫苗

近期&#xff0c;沈阳药科大学孙进教授团队、罗聪教授团队与新加坡国立大学陈小元教授团队共同合作在美国化学会旗下期刊《ACS nano》&#xff08;IF17.1&#xff09;上发表题为“Self-Adjuvanting Polyguanidine Nanovaccines for Cancer Immunotherapy”&#xff08;用于癌症…

Sora,开启通往世界模拟之路!

2024年2月16日&#xff0c;OpenAI发布视频生成AI大模型Sora。消息一经发出&#xff0c;业界再一次被之震撼。 OpenAI官网描述&#xff1a;Sora是一个根据文本指令生成真实与虚拟场景的AI模型&#xff0c;可根据用户指令生成时长达1分钟的高清视频&#xff0c;能生成具有多个角色…

ee trade:主力如何建仓吸筹的

主力建仓吸筹是指大型机构投资者或市场主力在股票市场中通过一系列策略和操作&#xff0c;逐步购买并积累大量股票&#xff0c;以建立或增加其在某只股票上的持仓。这个过程通常是为了在未来通过股价上涨来实现盈利。以下是一些主力可能采用的建仓吸筹策略&#xff1a; 隐蔽吸…

命运方舟 失落的方舟台服下载教程+账号注册教程(图文全攻略)

命运方舟 失落的方舟台服下载教程账号注册教程(图文全攻略) 失落的方舟&#xff0c;作为今年一款备受瞩目的MMORPG类型游戏&#xff0c;在官宣的时候就收获了一波不小的热度。这款游戏由游戏开发商Smile gate开发&#xff0c;游戏本体搭建于知名的虚幻引擎之上&#xff0c;为玩…

torch.scatter看图理解

torch.Tensor.scatter 有 4 个参数&#xff1a; scatter(dim, index, src, reduceNone) 先忽略 Reduce&#xff0c;最后再解释。先从最简单的开始。我们有一个 (2,4) 形状的张量&#xff0c;里面填充了 1&#xff1a; 粉红色的符号表示张量结构 并且我们传入相应的参数并得到…

5.25.6 深度学习在放射图像中检测和分类乳腺癌病变

计算机辅助诊断 (CAD) 系统使用数字化乳房 X 线摄影图像并识别乳房中存在的异常情况。深度学习方法从有限数量的专家注释数据中学习图像特征并预测必要的对象。卷积神经网络&#xff08;CNN&#xff09;在图像检测、识别和分类等各种图像分析任务中的性能近年来表现出色。本文提…

用易查分制作研学活动报名,支持在线签名,一键导出报名统计表格!

学校组织研学活动时&#xff0c;需要家长扫码在线填写报名信息&#xff0c;确认安全承诺和手写签名&#xff0c;提交报名后希望分配报名号&#xff0c;应该如何实现&#xff1f; 易查分的新建填表功能就可以实现上述需求&#xff0c;下面就来教大家如何制作吧。 &#x1f4cc;使…

常用IP核的引脚图

一、复数乘法 这是一个Xilinx&#xff08;赛灵思&#xff09;的复数乘法IP核的接口图&#xff0c;包含了几个主要的AXI-Stream接口。每个接口都有其特定的用途&#xff0c;下面将详细解释各个引脚的作用。 主要接口和引脚说明 S_AXIS_A&#xff08;输入复数A&#xff09; s…

【网络安全】新的恶意软件:无文件恶意软件GhostHook正在广泛传播

文章目录 推荐阅读 一种新的恶意软件 GhostHook v1.0 正在一个网络犯罪论坛上迅速传播。这种创新的无文件浏览器恶意软件由 Native-One 黑客组织开发&#xff0c;具有独特的分发方式和多功能性&#xff0c;对各种平台和浏览器构成重大威胁。 GhostHook v1.0 支持 Windows、Andr…

一个交易者的自白:念念不忘的交易,10个日内9个亏

一、新手: 面对爆仓,我像个白痴 我是在2012年开始接触的&#xff0c;这些年里我尝到了残酷失败的滋味&#xff0c;更品尝过胜利带来的喜悦。刚刚接触时很自信&#xff0c;总想着自己有一天一定会变成千万富翁的&#xff0c;用杠杆获取暴利。 在我首次爆仓的时候&#xff0c;我的…

QT6.2.4 MSVC2019 连接MySql数据库,无驱动问题

1.下载 查询一下数据库驱动 qDebug()<<QSqlDatabase::drivers(); 结果显示&#xff0c;没有QMYSQL的驱动。 QList("QSQLITE", "QMARIADB", "QODBC", "QPSQL") MySql6.2.4驱动下载地址&#xff0c;如果是别的版本&#xff0c;…

使用Python构建CART决策树回归模型

数据预处理 此次构建模型是根据泰坦迪克号邮轮票价、乘客性别、船上亲友数量等特征信息来预测乘客存活率的模型&#xff0c;使用的数据集为泰坦尼克数据集&#xff0c;下载地址&#xff1a;taitanic | Kaggle。 在下载完数据集后&#xff0c;可以先试用 ydata_profiling库&am…