【算法】动态规划

article/2025/6/19 16:45:50

一、动态规划的基本思想

  1. 动态规划算法与分治法类似,其基本思想也是将待求解的较大规模问题分解为若干个较小的子问题,先求解子问题,再从这些子问题的解得到原问题的解。

  2. 动态规划法有自己的特点分治法的子问题相互独立,适合动态规划算法求解的问题,经分解得到的子问题往往不是互相独立的

  3. 如果子问题不是互相独立的,在用分治法求解时,有些子问题被重复计算许多次。如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算。

二、案例

1. 最短路径问题

【问题描述】
输入:起点集合{S1,S2,…,Sn},
终点集合{T1,T2,…,Tm},
中间结点集,边集E,
对于任意边有长度输出:一条从起点到终点的最短路
在这里插入图片描述
算法设计

蛮力穷举算法:

考察每一条从某个起点到某个终点的路径,计算长度,从中找出最短路径。在示例实例中,如果网络的层数为k,那么路径条数为O(2k)

动态规划算法求解:

在这里插入图片描述

动态规划并不能解决所有问题

子问题的界定,后边界不变,前边界前移
在这里插入图片描述
优化函数的特点:任何最短路的子路径相对于子问题的始点终点最短!
优化原则/最优子结构性质: 一个最优决策序列的任何子序列本身一定是
相对于子序列的初始和结束状态的最优决策序列。

并非所有问题都满足优化原则/最优子结构性质,即动态规划并不能解决所有问题

2. 一个反例

求总长模10的最小路径
在这里插入图片描述
动态规划法得到的解:下、上、上、上
正确的最优解:下、下、下、下

  1. 动态规划算法求解过程是多阶段决策过程,每步处理一个子问题,可用于求解组合优化问题。
  2. 动态规划算法适用条件:问题要满足优化原则/最优子结构性质,即一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束状态的最优决策序列。

3. 动态规划要考虑的问题

  1. 问题抽象建模:优化的目标函数是什么?约束条件是什么?
  2. 如何划分子问题(边界)?
  3. 问题的优化函数值与子问题的优化函数值存在着什么依赖关系?(找出递推方程)
  4. 是否满足优化原则/最优子结构性质?
  5. 最小子问题怎么界定?其优化函数值(初值)是什么?

动态规划算法设计的要素

  1. 与蛮力算法相比较,动态规划算法利用了子问题优化函数间的依赖关系,时间复杂度有所降低
  2. 动态规划算法的递归实现效率不高,原因在于同一子问题多次重复出现,每次出现都需要重新计算一遍
  3. 可以采用空间换时间策略,记录每个子问题首次计算结果,后面再用时就直接取值,每个子问题只算一次

4. 矩阵连乘问题/矩阵链相乘

【问题描述】给定n个矩阵 , 其中 与 是可乘的, 。 {A1, A2 ,…, An}Ai Ai+1 i=1,2,…,n−1试确定矩阵的乘法顺序,使得元素相乘的总次数最小。

  1. 由于矩阵乘法满足结合律,所以计算矩阵的连乘 可以有 A1A2…An许多不同的计算次序。这种计算次序可以用加括号的方式来确定。
  2. 若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积。

输入:向量P=<P0,P1,…,Pn>,其中P0,P1,…,Pn为n个矩阵的行数和列数
输出:矩阵链乘法加括号的位置

矩阵Aixj与矩阵Bjxk的乘法,得到C=AB为i行k列的矩阵
在这里插入图片描述
矩阵C 的每个元素需要做j次乘法得到,计算AB总计算次数为ijk

输入:向量P =<10,100,5,50 >
即:A1:10x100, A2:100x5, A3:5x50

乘法次序不同运算量不同
(A1A2)A3:10x100x5 + 100x5x50 = 7500 计算次数少很多!
A1(A2A3):10x100x50 + 100x5x50 = 75000

动态规划算法的基本要素

最优子结构

  1. 矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。
  2. 在分析问题的最优子结构性质时,所用的方法具有普遍性:首先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。(反证法)
  3. 利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。

注意:同一个问题可以有多种方式刻划它的最优子结构,有些表示
方法的求解速度更快(空间占用小,问题的维度低)

重叠子问题

  1. 递归算法求解问题时,每次产生的子问题并不总是新问题,有些
    子问题被反复计算多次。这种性质称为子问题的重叠性质。
  2. 动态规划算法,对每一个子问题只解一次,而后将其解保存在一
    个表格中,当再次需要解此子问题时,只是简单地用常数时间查
    看一下结果。
  3. 通常不同的子问题个数随问题的大小呈多项式增长。因此用动态
    规划算法只需要多项式时间,从而获得较高的解题效率。

备忘录方法
备忘录方法的控制结构与直接递归方法的控制结构相同,区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解。

5. 凸多边形最优三角剖分

【问题描述】

  1. 用多边形顶点的逆时针序列表示凸多边形,即P={v0,v1,…,vn-1}表示具有n条边的凸多边形。

  2. 若vi与vj是多边形上不相邻的2个顶点,则线段vivj称为多边形的一条弦。弦将多边形分割成2个多边形{vi,vi+1,…,vj}和{vj,vj+1,…vi}。

  3. 多边形的三角剖分是将多边形分割成互不相交的三角形的弦的集合T。

  4. 给定凸多边形P,以及定义在由多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形的三角剖分,使得即该三角剖分中诸三角形上权之和为最小。
    在这里插入图片描述

  5. 一个表达式的完全加括号方式相应于一棵完全二叉树,称为表达式的语法树。例如,完全加括号的矩阵连乘积((A1(A2A3))(A4(A5A6)))所相应的语法树如图 (a)所示。

  6. 凸多边形{v0,v1,…vn-1}的三角剖分也可以用语法树表示。例如,图 (b)中凸多边形的三角剖分可用图 (a)所示的语法树表示。

  7. 矩阵连乘积中的每个矩阵Ai对应于凸(n+1)边形中的一条边vi-1vi。三角剖分中的一条弦vivj,i<j,对应于矩阵连乘积A[i+1:j]
    在这里插入图片描述
    最优子结构性质

  8. 凸多边形的最优三角剖分问题有最优子结构性质。

  9. (反证法)若凸(n+1)边形P={v0,v1,…,vn-1}的最优三角剖分T包含三角形v0 v k vn,1≤k≤n-1,则T的权为3个部分权的和:三角形v0 vk vn的权,子多边形{
    v0,v1,…,vk}和{vk,vk+1,…,vn}的权之和。
    可以断言,由T所确定的这2个子多边形的三角剖分也是最优的。因为若有{v0,v1,…,vk}或{vk,vk+1,…,vn}的更小权的三角剖分将导致T不是最优三角剖分的矛盾。

6. 0-1背包问题

【问题描述】

  1. 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。
  2. 问题:应如何选择装入背包的物品,使得装入背包中物品的总价值最大
  3. 物品i给要么装入背包,要么不装入背包。不能部分装入、不能装入多次。因此,该问题被称为0-1背包问题。其是一个特殊的整数规划问题。

http://www.hkcw.cn/article/DbmXtWmZBg.shtml

相关文章

设计模式——原型设计模式(创建型)

摘要 本文详细介绍了原型设计模式&#xff0c;这是一种创建型设计模式&#xff0c;通过复制现有对象&#xff08;原型&#xff09;来创建新对象&#xff0c;避免使用new关键字&#xff0c;可提高性能并简化对象创建逻辑。文章阐述了其优点&#xff0c;如提高性能、动态扩展和简…

java程序从服务器端到Lambda函数的迁移与优化

source&#xff1a;https://www.jfokus.se/jfokus24-preso/From-Serverful-to-Serverless-Java.pdf 从传统的服务器端Java应用&#xff0c;到如今的无服务器架构。这不仅仅是技术名词的改变&#xff0c;更是开发模式和运维理念的一次深刻变革。先快速回顾一下我们熟悉的“服务…

57、IdentityServer4概述

IdentityServer4是一个基于ASP.NET Core的开源身份认证和授权框架&#xff0c;实现了OpenID Connect和OAuth 2.0协议。它为现代应用程序提供集中式的身份验证和授权服务&#xff0c;支持单点登录&#xff08;SSO&#xff09;、令牌颁发与验证、会话管理等功能&#xff0c;广泛应…

2025.5.29 学习日记 docker概念以及基本指令

Docker&#xff1a; Docker 是一种开源的容器化平台&#xff0c;用于快速部署应用程序&#xff0c;实现开发、测试和生产环境的一致性。 一、Docker 核心概念 镜像&#xff08;Image&#xff09; 只读的模板文件&#xff0c;用于创建容器&#xff0c;类似虚拟机的镜像&#x…

AI与智能驾驶的关系和原理:技术融合与未来展望-优雅草卓伊凡一、AI大模型基础原理与智能驾驶

AI与智能驾驶的关系和原理&#xff1a;技术融合与未来展望-优雅草卓伊凡 一、AI大模型基础原理与智能驾驶 1.1 AI大模型的核心架构 本内容由优雅草木心为卓伊凡提供技术辅助讲解&#xff0c;毕竟木心目前正在比亚迪。 人工智能大模型是基于深度学习的复杂神经网络系统&#…

企业AI部署热潮下的安全隐忧:速度与安全的博弈

数据来源&#xff1a;企业网D1net 企业AI部署热潮下的安全隐忧&#xff1a;速度与安全的博弈 近年来&#xff0c;生成式人工智能&#xff08;GenAI&#xff09;的迅猛发展让企业趋之若鹜。然而&#xff0c;在这场技术竞赛中&#xff0c;不少企业却因盲目追求速度而忽视了安全…

分析XSSstrike源码

#用于学习web安全自动化工具# 我能收获什么&#xff1f; 1.XSS漏洞检测机制 学习如何构造和发送XSS payload如何识别响应中的回显&#xff0c;WAF&#xff0c;过滤规则等如何使用词典&#xff0c;编码策略&#xff0c;上下文探测等绕过过滤器 2.Python安全工具开发技巧 使…

通过mqtt 点灯

1 解析mqtt 传过来的json 用cjson 解析。 2 类似mvc的结构&#xff0c;调用具体的动作函数 定义设备处理结构体&#xff1a;使用结构体数组映射设备名称与处理函数&#xff0c;实现可扩展的指令分发分离设备逻辑&#xff1a;为每个设备&#xff08;如 LED、Motor&#xff0…

解锁技术世界的“秘密知识库”:The Book of Secret Knowledge 深度解析

在浩如烟海的技术文档中,你是否渴望一个集中式宝库,收录那些资深工程师口耳相传的“秘密武器”?GitHub 上爆火的 The Book of Secret Knowledge 正是这样一个令人惊叹的集合。今天我们来深入探索这个项目,挖掘它的核心价值。 🔍 项目核心:不是什么,而是什么 不是一本传…

M4Pro安装ELK(ElasticSearch+LogStash+Kibana)踩坑记录

ElasticSearch安装&#xff0c;启动端口9200&#xff1a; docker pull elasticsearch:8.13.0 新增配置文件elasticsearch.yml&#xff1a; cd /opt/homebrew/etc/ mkdir elasticsearch_config cd elasticsearch_config vi elasticsearch.yml cluster.name: "nfturbo…

VC++: identifer “M_PI“ is undefined

本周拿到一份算法文件&#xff08;cpp),尝试在本机跑一下&#xff0c;提示M_PI不识别&#xff1a; identifer "M_PI" is undefined 解决方案&#xff1a; #define _USE_MATH_DEFINES

关于镜像如何装进虚拟机

本篇文章为感谢小仙猪老师特别编写 本篇文章仅以Ubuntu为例 目录 创建虚拟机 汉化 如果没有China选项 检查网络 创建虚拟机 第一步&#xff0c;创建虚拟机 因为&#xff0c;第一个选项是会把虚拟机的文件放在c盘因此&#xff0c;这里博主选择自定义&#xff0c;然后下一…

青柠日记:记录美好,守护隐私

在快节奏的现代生活中&#xff0c;日记成为了许多人记录生活、抒发情感的重要方式。而青柠日记这款软件&#xff0c;以其便捷的操作、丰富的模板和强大的隐私保护功能&#xff0c;为用户提供了一个理想的日记记录平台。无论是日常的琐碎点滴&#xff0c;还是重要的生活事件&…

【技能拾遗】——家庭宽带单线复用布线与配置(移动2025版)

&#x1f4d6; 前言&#xff1a;在家庭网络拓扑中&#xff0c;客厅到弱电箱只预埋了一根网线&#xff0c;由于已将广电的有线电视取消并改用IPTV。现在需要解决在客厅布置路由器和观看IPTV问题&#xff0c;这里就用到单线复用技术。 目录 &#x1f552; 1. 拓扑规划&#x1f55…

Visual Studio笔记:MSVC工具集、MSBuild

1. MSVC工具集 1.1 什么叫MSVC工具集 也可以说Visual Studio平台工具集&#xff08;Platform toolset&#xff09;. 这些工具包括 C/C 编译器、链接器、汇编程序和其他生成工具以及匹配的库和头文件。 Visual Studio 2015、Visual Studio 2017 和 Visual Studio 2019 是二进制…

【系统配置与部署类】docker的深度配置和应用

相关文章已经在个人博客网站上更新&#xff0c;欢迎访问&#xff1a; docker的深度配置和应用http://www.turnin-blog.online/articles/%E7%B3%BB%E7%BB%9F%E9%85%8D%E7%BD%AE%E4%B8%8E%E9%83%A8%E7%BD%B2/docker%E7%9A%84%E6%B7%B1%E5%BA%A6%E9%85%8D%E7%BD%AE%E5%92%8C%E5%B…

Redis最佳实践——安全与稳定性保障之数据持久化详解

Redis 在电商应用的安全与稳定性保障之数据持久化全面详解 一、持久化机制深度解析 1. 持久化策略矩阵 策略触发方式数据完整性恢复速度适用场景RDB定时快照分钟级快容灾备份/快速恢复AOF实时追加日志秒级慢金融交易/订单关键操作混合模式RDBAOF同时启用秒级中等高安全要求场…

告别硬编码!用工厂模式优雅构建可扩展的 Spring Boot 应用 [特殊字符]

嗨&#xff0c;各位技术伙伴们&#xff01;&#x1f44b; 在日常的软件开发中&#xff0c;我们经常面临需求变更的挑战。如何构建一个既能满足当前需求&#xff0c;又能轻松应对未来变化的系统呢&#xff1f;答案往往藏在那些经典的设计模式中。 今天&#xff0c;我们就来聊聊…

azure web app创建分步指南系列之二

为注册表授权托管标识 你创建的托管标识尚未获得从容器注册表中提取数据的授权。在此步骤中,你将启用授权。 返回容器注册表的管理页面: 在左侧导航菜单中,选择“访问控制 (IAM)”。选择“添加角色分配”。此屏幕截图显示了如何为容器注册表启用添加角色分配。在角色列表中…

使用Yolov8 训练交通标志数据集:TT100K数据集划分

使用Yolov8 训练交通标志数据集&#xff1a;TT100K数据集划分&#xff08;一&#xff09; 一、数据集下载二、划分数据集三、目录放置 一、数据集下载 官方网址&#xff1a;TT100K 数据集对比 源码如下&#xff1a; def classes(filedir):with open(filedir) as f:classes …