动态规划原理

article/2025/10/31 20:07:06

1. 基本概念

动态规划通过拆分问题,将问题拆分成许多的子问题,定义问题状态和状态之间的关系(即状态转移方程或递推公式),使得问题能够以递推(或者说分治)的方式去解决。按顺序求解子问题,前一子问题的解,为后一子问题的求解提供了有用的信息,在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。 [2] 。

1.1 动态规划和递归之间的关系

动态规划本质上就是递归,动态规划通过将问题划分为若干个子问题,通过递推关系,一步一步求得最终问题的关系。但是子问题之间可能会有重复,因此如果单纯的使用递归方法来实现动态规划问题时间复杂度会比较高。
但是,一般能用递归解决的问题都可以转化为用动态规划解决。

以斐波那契数列为例:
其递归代码为:
def fiboSeq(n):if n <= 1:return nelse:return (fiboSeq(n - 1) + fiboSeq(n - 2))

在这里插入图片描述
可以看出,传统的递归是从上向下的计算,某些子问题会被重复计算,如在计算第四项裴波那契数列时,F(2)倍计算了2次。其时间复杂度为o(2^n)

添加备忘录的写法(还是从上到下):

由于传统的递归写法,会重复计算某一些子问题,为了解决这些问题,我们可以提前申请一个数组,用来记录计算过的子问题,当递归的时候,就不用再重复计算某些子问题了。其时间复杂度和空间复杂度均为O(n)。

def fiboSeq(n):if n < 0:return 0memories = [-1 for i in range(n + 1)]if n == 0:memories[n] = 0return 0if n == 1:memories[n] = 1return 1if n == 2:memories[n] = 1return 1if memories[n] != -1:return memories[n]else:memories[n] = fiboSeq(n-1) + fiboSeq(n-2)return memories[n]
从下到上(借助辅助数组)(动态规划):

从f(1)开始算,逐步计算出f(2),……,f(n)。由于接住了一个辅助数组,时间复杂度为o(n),空间复杂度为o(n)

def fiboSeq(n):if n < 0:return 0if n <= 1:return nif n == 2:return 1arr = [0,1,1]for i in range(3,n+1):arr.append(arr[i-1]+arr[i-2])return arr[n]
从下到上(不借助辅助数组):

通过上面的代码可以看出,每次参与循环的只有 i,i-1 , i-2三项,因此该方法的空间可以进一步的压缩如下,空间复杂度为o(1)。

def fiboSeq(n):if n < 0:return 0if n <= 1:return nif n == 2:return 1memories_2 = 1memories_1 = 1for i in range(3,n+1):memories_0 = memories_1 + memories_2memories_2 = memories_1memories_1 = memories_0return memories_0

前两种利用递归的方法是从要求解的第n项裴波那契数列开始,逐步向下求解子问题,然后再一步步返回,求得最终的结果。
后两种动态规划方法是从第一项裴波那契数列开始,通过前面子问题的解,来得到后面子问题的解。
动态规划可以把递归的指数复杂度提高到线性复杂度。

2. 动态规划适用情况

(1)最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。最优子结构应可以理解为大问题可以不断的分解为小问题,通过每个小问题的最优解可以得到相应大问题的最优解。
(2)无后效性:即某阶段状态(最优解)一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。
(3)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。就比如前面的裴波那契数列的递归算法,进行一次递归f(1)就被计算一次,因此裴波那契数列可以利用动态规划的方法进行求解。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势,在动态规划算法中使用数组来保存子问题的解,这样子问题多次求解的时候可以直接查表不用调用函数递归。

3. 动态规划的步骤

动态规划所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。如图所示。动态规划的设计都有着一定的模式,一般要经历以下几个步骤,如下图所示:
初始状态→│决策1│→│决策2│→…→│决策n│→结束状态
(1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,即前后有所关联,否则问题就无法求解。
(2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。
(3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系(状态转移方程)来确定决策,即当前子问题的最优解是什么。
(4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。
一般,只要解决问题的阶段、状态和状态转移决策确定了,就可以写出状态转移方程(包括边界条件)。实际应用中可以按以下几个简化的步骤进行设计:
(1)分析最优解的性质,并刻画其结构特征。
(2)递归的定义最优解。
(3)以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值。
(4)根据计算最优值时得到的信息,构造问题的最优解。

ps:备忘录通常有两种:

线性模型:数组存储各个子问题的最优解,如小朋友过桥
区间模型:矩阵存储各个子问题的最优解,如背包问题,不过背包问题也可以进行空间优化,成为线性模型。


http://chatgpt.dhexx.cn/article/dlZUPLxT.shtml

相关文章

动态代理详解

想要更加透彻的理解动态代理&#xff0c;首先要熟悉下静态代理 一、静态代理 总结来说&#xff1a;目标类和代理类实现了相同的接口&#xff0c;在代理类中依赖了目标类&#xff0c;代理类的方法中调用了目标类的方法&#xff0c;并做了一些增强性的工作。 1、实现静态代理&…

CAD动态块制作

CAD动态块制作 拉伸动态块柜体A拉伸动态块制作第一步&#xff1a;制作柜体A第二步&#xff1a;进入块编辑器编辑第三步&#xff1a;关闭块编辑器 柜体B拉伸动态块制作第一步&#xff1a;制作柜体B第二步&#xff1a;进入块编辑器第三步&#xff1a;关闭块编辑器 可见性动态块第…

数据有效性 动态选择

EXCEL有两列数据栏&#xff0c;A列和B列&#xff0c;都是通过下来框来选择&#xff0c;要求A列选择完成后&#xff0c;B列动态调整可选择的内容。例如&#xff1a;第一例选择“AA”&#xff0c;第二列可供选择的范围是“a-d”&#xff1b;第一例选择“BB”&#xff0c;第二列可…

OTP 动态口令验证

OTP 动态口令验证。 简介 动态口令&#xff08;OTP&#xff0c;One-Time Password&#xff09;又称一次性密码&#xff0c;是使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术&#xff0c;是一种强认证技术&#xff0c;是增强目前静态口令认证的一种非常方…

loj#122.「强制在线」动态图连通性

loj#122. 「强制在线」动态图连通性 UPD:(7个月以后)这代码被叉了,我不想改了( negii真dl 然后发现这格式一更新…啊我的公式和链接怎么假掉了( csdn[] 算了不管了…反正这样子的话之后也不会用了( 题意 N 个点,M 次操作,支持加边/删边/询问两点间连通性。 强制在线。…

ORL、Yale等人脸数据库百度云链接

近段时间做人脸识别的实验&#xff0c;收集了几个人脸库&#xff0c;如图 这里放出百度云的链接&#xff0c;需要的自取 链接&#xff1a;https://pan.baidu.com/s/11_7bFdo_hhc83WQXmWtxvw 提取码&#xff1a;5ohd 强推这个文章&#xff0c;里面有16个人脸库的百度云链接 ht…

ORTP

1.为什么要使用RTP 一提到流媒体传输、一谈到什么视频监控、视频会议、语音电话&#xff08;VOIP&#xff09;&#xff0c;都离不开RTP协议的应用&#xff0c;但当大家都根据经验或者别人的应用而选择RTP协议的时候&#xff0c;你可曾想过&#xff0c;为什么我们要使用RTP来进行…

oracle中or的使用,Oracle Or

oracle函数 的 Oracle Or 在本教程中,我们来学习如何使用Oracle OR运算符来组合两个或更多的布尔表达式。 Oracle OR运算符介绍 OR运算符是一个逻辑运算符,它组合了布尔表达式,如果其中一个表达式为真(true),则返回true。 以下说明OR运算符的语法: expression_1 AND expre…

基于PCA方法的ORL人脸识别及Python代码实现

基于PCA方法的ORL人脸识别及Python代码实现 PCA算法方案设计代码实现结果分析参考文献 PCA的理论知识已经有很多博客做了清晰的解释&#xff0c;主要概括为找到投影的面使得类间误差最大&#xff0c;转化为找到构建的协方差的特征值与特征向量&#xff0c;在新的投影方向&#…

ORL Character Recgnition

文章目录 ORL Character Recgnition0 Abstract1 Introduction2 Related Work2.1 Character recognition2.2 Text detection 3 Connection Text Proposal Network3.1 Anchor3.2 Bi-Directional LSTM3.3 RPN layer3.4 Text line constructor3.5 Loss function3.6 Total system3.7…

ORL Faces Database介绍

ORL人脸数据集共包含40个不同人的400张图像&#xff0c;是在1992年4月至1994年4月期间由英国剑桥的Olivetti研究实验室创建。 此数据集下包含40个目录&#xff0c;每个目录下有10张图像&#xff0c;每个目录表示一个不同的人。所有的图像是以PGM格式存储&#xff0c;灰度图&…

基于ORL人脸数据库和PCA特征降维算法的人脸识别matlab仿真

目录 1.算法仿真效果 2.MATLAB核心程序 3.算法涉及理论知识概要 4.完整MATLAB 1.算法仿真效果 matlab2022a仿真结果如下&#xff1a; 2.MATLAB核心程序 ...................................................................... for i1:40sub_dir strcat(s, num2str(i))…

【图像处理matlab】PCA+KNN人脸识别 ORL人脸数据集

文章目录 0.写在前面1. 数据集导入与划分2. train-PCA构建脸空间2.1 原始数据导入2.2 去中心化2.3 求解协方差矩阵、特征值、特征向量2.4 特征脸选取--脸空间 3. test-物以类聚 KNN分类3.1 KNN简介3.2 KNN实现步骤3.2.1 距离度量---欧式距离、豪斯多夫距离.......3.2.2 k值选择…

Orcal 数据库

目录 一、数据库 1. 数据库概念 2. SQL 语言 3. Oracle结构 4. 表&#xff08;Table&#xff09; 5. 三范式 6. SELECT 语句 二、Orcal 基本操作 1. 查询列&#xff08;字段&#xff09; 2. 查询行&#xff08;记录&#xff09; 2.1 比较条件 2.2 且或非 2.3 null…

【人脸识别】基于PCA实现ORL人脸识别附matlab代码和报告

1 简介 人脸识别技术先进,应用广泛。借助PCA算法,利用MATLAB GUI可以简单操作,通过对待识别图像的预处理即可提高识别率。本文首先对相关概念进行了阐述,对工作原理进行了介绍,具体对基于PCA算法人脸识别的MATLAB实现进行了解析。 2 部分代码 function [neednum,average_face…

orical

truncate 和delete table 表名&#xff08;前面效率比后面高&#xff0c;而且前面执行后无法停止&#xff0c;前面会将orical查找数据时使用的节点删除&#xff0c;后面不会&#xff09; select * from 表名 会消耗大量资源不建议使用了&#xff1b; creat table 表名 as selec…

基于BP神经网络和ORL库的人脸识别matlab仿真

目录 一、理论基础 二、案例背景 1.问题描述 2.思路流程 三、部分MATLAB代码 四、仿真结论分析 五、参考文献 一、理论基础 这里&#xff0c;人脸的识别主要依据如下的流程进行&#xff1a; 具体的算法流程是这么一个过程&#xff1a; 第一&#xff1a;首先初始化一个区…

图像处理ORL--训练集及测试集建立--Matlab实现

在深度学习的研究与学习过程中&#xff0c;往往对神经网络的网络结构以及代码有比较好的理解&#xff0c;但基于matlab的数据集建立等操作经常困扰初学者。 今天带来matlab数据集建立的文件结构与代码。 文件格式 首先将图片保存在当前运行文件的文件夹中&#xff0c;将其命名…

深度学习入门_对ORL数据集进行特征提取降维后SVM分类

ORL人脸数据集共包含40个不同人的400张图像。所有图像都是以PGM格式存储的灰度图。每一个目录下的图像是在不同的时间、不同的光照、不同的面部表情条件下采集的。在该数据集中&#xff0c;每个人有10张照片。这10张照片中&#xff0c;前8张作为训练集&#xff0c;而后2张归为测…

编译原理——词法分析器实验

实验目的 掌握词法分析器的功能。掌握词法分析器的实现。 实验内容及要求 对于如下文法所定义的语言子集&#xff0c;试编写并上机调试一个词法分析程序&#xff1a; <程序>→PROGRAM <标识符>;<分程序>. <分程序>→<变量说明>BEGIN<语…