动态规划:解决复杂问题的利器(下)

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 4. 动态规划的应用
    • 背包问题
    • 最长公共子序列问题
    • 斐波那契数列问题
  • 5. 动态规划的优化技巧
    • 备忘录法
    • 动态规划表格
    • 状态压缩
  • 6. 总结
    • 动态规划的优势和局限
    • 动态规划在实际问题中的应用

4. 动态规划的应用

背包问题

背包问题(Knapsack Problem)是动态规划的一个经典应用
它描述了在给定总容量的情况下,如何选择物品使得总价值最大。

具体来说,背包问题可以描述为:给定一个物品集合,每个物品有一个重量和一个价值,以及一个固定的背包容量。我们的目标是选择一些物品放入背包中,使得背包中的总价值最大,同时不超过背包的容量。

以下是使用动态规划来解决背包问题的步骤:

一、定义状态

在背包问题中,我们可以定义状态为 dp[i][j],表示在前 i 个物品中,选择重量不超过 j 的物品的最大价值。

二、确定状态转移方程

状态转移方程是指根据当前状态和决策来更新状态。在背包问题中,状态转移方程为:

dp[i][j] = max(dp[i-1][j], dp[i-1][j - weight[i]] + value[i])

其中,dp[i-1][j] 表示不选择第 i 个物品的最大价值,dp[i-1][j - weight[i]] + value[i] 表示选择第 i 个物品的最大价值。

三、计算最优值

在确定了状态和状态转移方程后,我们可以通过迭代计算每个状态的最优值,最终得到整个问题的最优解。

具体来说,我们可以从第一个物品开始,依次计算每个物品的状态转移方程,更新 dp 数组。最终,dp[n][capacity] 就是在所有物品中选择不超过背包容量的物品的最大价值。

需要注意的是,在实际问题中,可能需要根据问题的具体情况来选择合适的状态和状态转移方程,并且可能需要使用一些优化技巧来提高算法的效率。

最长公共子序列问题

最长公共子序列问题(Longest Common Subsequence,LCS)是动态规划的另一个经典应用。它描述了在两个字符串中找到最长公共子序列的长度。

具体来说,最长公共子序列问题可以描述为:给定两个字符串 s1s2,找到它们的最长公共子序列的长度。

以下是使用动态规划来解决最长公共子序列问题的步骤:

一、定义状态

在最长公共子序列问题中,我们可以定义状态为 dp[i][j],表示在字符串 s1 的前 i 个字符和字符串 s2 的前 j 个字符中,最长公共子序列的长度。

二、确定状态转移方程

状态转移方程是指根据当前状态和决策来更新状态。在最长公共子序列问题中,状态转移方程为:

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

其中,dp[i-1][j] 表示在字符串 s1 的前 i-1 个字符和字符串 s2 的前 j 个字符中,最长公共子序列的长度,dp[i][j-1] 表示在字符串 s1 的前 i 个字符和字符串 s2 的前 j-1 个字符中,最长公共子序列的长度,dp[i-1][j-1] + 1 表示在字符串 s1 的前 i-1 个字符和字符串 s2 的前 j-1 个字符中,它们的最后一个字符相同的情况下,最长公共子序列的长度加 1。

三、计算最优值

在确定了状态和状态转移方程后,我们可以通过迭代计算每个状态的最优值,最终得到整个问题的最优解。

具体来说,我们可以从第一个字符开始,依次计算每个字符的状态转移方程,更新 dp 数组。最终,dp[n][m] 就是两个字符串的最长公共子序列的长度。

需要注意的是,在实际问题中,可能需要根据问题的具体情况来选择合适的状态和状态转移方程,并且可能需要使用一些优化技巧来提高算法的效率。

斐波那契数列问题

斐波那契数列问题(Fibonacci Number Problem)是动态规划的另一个经典应用
它描述了在给定两个初始值的情况下,如何计算斐波那契数列的后续数值。

具体来说,斐波那契数列问题可以描述为:给定两个整数 ab,计算斐波那契数列中第 n 个数的值。

以下是使用动态规划来解决斐波那契数列问题的步骤:

一、定义状态

在斐波那契数列问题中,我们可以定义状态为 dp[i],表示斐波那契数列中第 i 个数的值。

二、确定状态转移方程

状态转移方程是指根据当前状态和决策来更新状态。在斐波那契数列问题中,状态转移方程为:

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

其中,dp[i-1] 表示斐波那契数列中第 i-1 个数的值,dp[i-2] 表示斐波那契数列中第 i-2 个数的值。

三、计算最优值

在确定了状态和状态转移方程后,我们可以通过迭代计算每个状态的最优值,最终得到整个问题的最优解。

具体来说,我们可以从第一个数开始,依次计算每个数的状态转移方程,更新 dp 数组。最终,dp[n] 就是斐波那契数列中第 n 个数的值。

需要注意的是,在实际问题中,可能需要根据问题的具体情况来选择合适的状态和状态转移方程,并且可能需要使用一些优化技巧来提高算法的效率。

5. 动态规划的优化技巧

备忘录法

备忘录法(Memoization)是一种常用的动态规划优化技巧,它通过存储已经计算过的子问题的解,避免了重复计算,从而提高了算法的效率

具体来说,备忘录法的基本思想是在计算每个状态的最优值时,先检查该状态是否已经计算过,如果已经计算过,则直接返回存储的结果,否则计算该状态的最优值,并将其存储起来,以便下次计算时使用。

以下是使用备忘录法来解决斐波那契数列问题的步骤:

一、定义状态

在斐波那契数列问题中,我们可以定义状态为 dp[i],表示斐波那契数列中第 i 个数的值。

二、确定状态转移方程

状态转移方程是指根据当前状态和决策来更新状态。在斐波那契数列问题中,状态转移方程为:

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

其中,dp[i-1] 表示斐波那契数列中第 i-1 个数的值,dp[i-2] 表示斐波那契数列中第 i-2 个数的值。

三、使用备忘录

在使用备忘录法时,我们需要创建一个备忘录数组 memo,用于存储已经计算过的状态的解。在计算状态 dp[i] 的最优值时,先检查 memo[i] 是否已经计算过,如果已经计算过,则直接返回 memo[i],否则计算 dp[i] 的值,并将其存储在 memo[i] 中。

四、计算最优值

在确定了状态和状态转移方程后,我们可以通过迭代计算每个状态的最优值,最终得到整个问题的最优解。

具体来说,我们可以从第一个数开始,依次计算每个数的状态转移方程,更新 dp 数组。在计算状态 dp[i] 的最优值时,先检查 memo[i] 是否已经计算过,如果已经计算过,则直接返回 memo[i],否则计算 dp[i] 的值,并将其存储在 memo[i] 中。最终,dp[n] 就是斐波那契数列中第 n 个数的值。

需要注意的是,在实际问题中,可能需要根据问题的具体情况来选择合适的状态和状态转移方程,并且可能需要使用一些优化技巧来提高算法的效率。

动态规划表格

动态规划表格(Dynamic Programming Table)是一种常用的动态规划优化技巧,它通过将状态和状态转移方程表示为表格的形式,来提高算法的效率。

具体来说,动态规划表格是一个二维数组,其中每一行表示一个状态,每一列表示一个决策。在表格中,每个元素表示该状态下执行该决策的最优值。

以下是使用动态规划表格来解决斐波那契数列问题的步骤:

一、定义状态

在斐波那契数列问题中,我们可以定义状态为 dp[i],表示斐波那契数列中第 i 个数的值。

二、确定状态转移方程

状态转移方程是指根据当前状态和决策来更新状态。在斐波那契数列问题中,状态转移方程为:

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

其中,dp[i-1] 表示斐波那契数列中第 i-1 个数的值,dp[i-2] 表示斐波那契数列中第 i-2 个数的值。

三、创建动态规划表格

在使用动态规划表格时,我们需要创建一个二维数组 dp,其中每一行表示一个状态,每一列表示一个决策。在斐波那契数列问题中,我们只需要一行,因为只有一个决策。

四、填充动态规划表格

在确定了状态和状态转移方程后,我们可以通过迭代计算每个状态的最优值,最终得到整个问题的最优解。

具体来说,我们可以从第一个数开始,依次计算每个数的状态转移方程,更新 dp 数组。在计算状态 dp[i] 的最优值时,直接从 dp 表格中获取 dp[i-1]dp[i-2] 的值,进行加法运算,并将结果存储在 dp[i] 中。最终,dp[n] 就是斐波那契数列中第 n 个数的值。

需要注意的是,在实际问题中,可能需要根据问题的具体情况来选择合适的状态和状态转移方程,并且可能需要使用一些优化技巧来提高算法的效率。

状态压缩

状态压缩(State Compression)是一种常用的动态规划优化技巧,它通过减少状态的数量,来提高算法的效率

具体来说,状态压缩是指将多个相关的状态合并为一个状态,从而减少状态的数量。在状态压缩中,我们需要选择合适的状态表示方法,使得状态之间的关系能够被有效地表示和处理。

以下是使用状态压缩来解决斐波那契数列问题的步骤:

一、定义状态

在斐波那契数列问题中,我们可以定义状态为 dp[i],表示斐波那契数列中第 i 个数的值。

二、确定状态转移方程

状态转移方程是指根据当前状态和决策来更新状态。在斐波那契数列问题中,状态转移方程为:

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

其中,dp[i-1] 表示斐波那契数列中第 i-1 个数的值,dp[i-2] 表示斐波那契数列中第 i-2 个数的值。

三、使用状态压缩

在使用状态压缩时,我们可以将斐波那契数列的前两个数作为初始状态,然后通过迭代计算后续的状态。具体来说,我们可以使用一个数组 dp 来存储状态,其中 dp[0]dp[1] 分别表示斐波那契数列的前两个数。

四、填充状态压缩数组

在确定了状态和状态转移方程后,我们可以通过迭代计算每个状态的最优值,最终得到整个问题的最优解。

具体来说,我们可以从第一个数开始,依次计算每个数的状态转移方程,更新 dp 数组。在计算状态 dp[i] 的最优值时,直接从 dp 数组中获取 dp[i-1]dp[i-2] 的值,进行加法运算,并将结果存储在 dp[i] 中。最终,dp[n] 就是斐波那契数列中第 n 个数的值。

需要注意的是,在实际问题中,可能需要根据问题的具体情况来选择合适的状态表示方法和状态转移方程,并且可能需要使用一些优化技巧来提高算法的效率。

6. 总结

动态规划的优势和局限

动态规划(Dynamic Programming,DP)是一种常用的算法设计技术,它在解决一些复杂问题时具有明显的优势,但也存在一些局限。

动态规划的优势:

  1. 高效性:动态规划可以有效地解决一些具有最优子结构的问题,通常可以在多项式时间内得到最优解。

  2. 简洁性:动态规划的算法设计通常比较简洁,易于理解和实现。

  3. 可扩展性:动态规划可以很容易地扩展到更复杂的问题,只需要修改状态定义和状态转移方程即可。
    在这里插入图片描述

动态规划的局限:

  1. 状态空间爆炸:对于一些问题,状态空间的大小可能会随着输入规模的增加呈指数级增长,导致动态规划无法直接应用。

  2. 无法处理非最优子结构:动态规划只能解决具有最优子结构的问题,如果问题不具有最优子结构,动态规划可能无法提供有效的解决方案。

  3. 数值稳定性:在一些情况下,动态规划的计算可能会出现数值不稳定的情况,导致结果不准确

  4. 依赖于问题的特征:动态规划的有效性很大程度上依赖于问题的特征,如果问题的特征不满足动态规划的要求,可能需要寻找其他的解决方法。
    在这里插入图片描述

总的来说,动态规划在处理一些具有最优子结构的问题时具有明显的优势,但在处理一些复杂问题时可能会受到限制。在实际应用中,需要根据具体问题的特点来选择合适的算法设计技术。

动态规划在实际问题中的应用

动态规划(Dynamic Programming,DP)是一种常用的算法设计技术,它在解决许多实际问题中都有广泛的应用,以下是一些常见的例子:

  1. 斐波那契数列问题:斐波那契数列是一个经典的动态规划问题,其中每个数都是前两个数的和。动态规划可以高效地计算出斐波那契数列的任意一项

  2. 背包问题:背包问题是一个在资源有限的情况下选择最优物品组合的问题。动态规划可以用来找出在给定背包容量下可获得的最大价值。

  3. 最长公共子序列问题最长公共子序列是两个序列中共同出现的最长子序列。动态规划可以用来找到两个序列的最长公共子序列。

  4. 图像压缩:动态规划可以用于图像压缩,通过将相似的像素块合并为一个代表性的像素块,从而减少图像的存储空间。

  5. 最优路径问题:在图论中,动态规划可以用来找到从一个节点到另一个节点的最短路径或最低成本路径

  6. 资源分配问题:动态规划可以用于资源分配问题,例如在生产计划中,如何在有限的资源下最大化产量。

  7. 字符串匹配问题:动态规划可以用于字符串匹配问题,例如 KMP 算法,它是一种高效的字符串匹配算法。

这些只是动态规划在实际问题中的一些应用,实际上,动态规划可以应用于许多其他领域,如金融、生物学、计算机科学等。动态规划的核心思想是将复杂问题分解为更小的子问题,并通过存储已经计算过的子问题的结果来避免重复计算,从而提高算法的效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用tomcat搭建简易文件服务器

步骤 1、在本机另外部署一个tomcat作为文件服务器 可以像我这样将tomcat文件复制一个做为服务器 2、在webapps下新建文件夹uploadfiles,这个文件夹就是用来存储上传的文件的 (记住一定要是在作为服务器的tomcat的webapps下) 3、修改conf/…

nvm for windows使用与node/npm/yarn的配置

1 下载 nvm for windows download – github 下拉到Assets, 下载.exe文件 2 安装 安装到如下文件夹中 目录可以自己选, 可以换别的名字, 自己记住即可 新手建议全部看完再进行个人配置, 或者使用与博主一致的路径 D:\DevelopEnvironment\nvm3 配置nvm使用的镜像 node_mir…

基于opencv+ImageAI+tensorflow的智能动漫人物识别系统——深度学习算法应用(含python、JS、模型源码)+数据集(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境爬虫模型训练实际应用 模块实现1. 数据准备1)爬虫下载原始图片2)手动筛选图片 2. 数据处理1)切割得到人物脸部2)重新命名处理后的图片3)添加到数据集 3. 模型训练及…

阿里云国际短信业务网络超时排障指南

选取一台或多台线上的应用服务器或选取相同网络环境下的机器,执行以下操作。 获取公网出口IP。 curl ifconfig.me 测试连通性。 (推荐)执行MTR命令(可能需要sudo权限),检测连通性,执行30秒。 m…

MySQL 插入数据报错 Incorrect string value

当在sys_dict_data表中执行插入语句; insert into sys_dict_data values(1, 1, 男, 0, sys_user_sex, , , Y, 0, admin, sysdate(), , null, 性别男);报错信息如下: insert into sys_dict_data values(1, 1, 男, …

小航助学题库蓝桥杯题库c++选拔赛(22年3月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号) 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)

解决:IDEA的debug模式只有第一次能拦截请求进行debug,后续所有请求全部失效

解决:IDEA的debug模式只有第一次能拦截请求进行debug,后续所有请求全部失效 一问题描述:IDEA的debug模式只有第一次能拦截请求进行debug,后续所有请求全部失效二问题原因:对IDEA的debug功能不熟悉或者理解有偏差三解决…

k8s-daemonset、job、cronjob控制器 6

Daemonset控制器(一个节点部署一个) 、 创建Daemonset控制器 控制节点上不能进行部署,有污点 解决方式: 扩容节点,token值过期的解决方法: 回收pod job控制器 需要使用perl镜像,仓库没有&…

hadoop操作

文件操作 注意当前所在的路径,创建一个mytest文件夹 创建一个1.txt文件 将1.txt文件移动到mytest中,通过mv改名字,然后查看mytest文件夹的txt文件变成了test.txt 删除文件 上传下载文件 新建1.txt 然后编辑它 随便输入什么 上传 然后看看网…

java学习part23异常try catch

124-异常处理-异常的概述与常见异常的举例_哔哩哔哩_bilibili 1.异常 2.try catch 3.finally 类似golang的defer 一定执行的语句

视图层与模板层

视图层 1 视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是…

day31_servlet

今日内容 零、 复习昨日 一、请求转发 二、重定向 三、Session 四、Filter 零、 复习昨日 一、请求转发 1.1 现有问题 响应的代码与接收请求代码在一起查询全部的代码与登录的代码在一起,考虑一下后续删除完,更新完要查全部怎么办?这也没有遵循单一职责,不便于后期维护ps: 开…

前端编码规范

文章目录 一、背景二、内容1、注释规范(1)文件注释(2)函数注释(3)单行注释(3)多行注释 2、命名规范(1)项目命名(2)目录命名&#xff0…

C# 使用 Fody 监控方法执行时间

写在前面 在做性能调优的时候,经常需要跟踪具体方法的执行时间;通过插入Stopwatch的方案对代码的侵入性太高了,所以引入了 MethodTimer.Fody 类库,采用编译时注入的方式给方法动态加上Stopwatch 跟踪代码,只需要在目标…

re:Invent 构建未来:云计算生成式 AI 诞生科技新局面

文章目录 前言什么是云计算云计算类型亚马逊云科技云计算最多的功能最大的客户和合作伙伴社区最安全最快的创新速度最成熟的运营专业能力 什么是生成式 AI如何使用生成式 AI后记 前言 在科技发展的滚滚浪潮中,我们见证了云计算的崛起和生成式 AI 的突破&#xff0c…

Python - Real-ESRGAN 提升图像、视频清晰度 - 最高可达 4 K

目录 一.引言 二.Real-ESRGAN 理论 1.模型简介 2.经典退化模型 ◆ 退化过程全览 ◆ K - 高斯滤波 ◆ N - 噪声 ◆ ↓r - Resize ◆ jpeg - 压缩 3.高阶退化模型 4.环形和超调伪影 5.网络结构 ◆ ESRGAN 生成器 ◆ U-Net 鉴别器 三.Real-ESRGAN 实战 1.快速体验…

YashanDB入选2023年世界互联网大会领先科技奖成果集《科技之魅》

近日,由深圳计算科学研究院自主研发的“崖山数据库系统YashanDB”入编2023年世界互联网大会领先科技奖成果集《科技之魅》。此次入选,充分彰显了YashanDB在数据库技术领域的突破性创新成果。 《科技之魅》是世界互联网大会领先科技奖的重要成果&#xff…

安网AC智能路由系统actpt_5g.data敏感信息泄露漏洞复现 [附POC]

文章目录 安网AC智能路由系统actpt_5g.data敏感信息泄露漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 安网AC智能路由系统actpt_5g.data敏感信息泄露漏洞复现 [附POC] 0x01 前言 免责声明:请勿利…

【python+Excel】读取和存储测试数据完成接口自动化测试

http_request2.py用于发起http请求 #读取多条测试用例 #1、导入requests模块 import requests #从 class_12_19.do_excel1导入read_data函数 from do_excel2 import read_data from do_excel2 import write_data from do_excel2 import count_case #定义http请求函数COOKIENon…

国密加密工业路由器 数据安全升级

国密加密工业路由器,简称国密加密路由器,是指遵循“商用密码管理规范”中规定的国家商用密码算法,采用国密加密芯片和密码算法的专业路由器。相比-般路由器,国密加密路由器具有更高级别的加密保护,可以有效提高数据传输…
最新文章