#03动态规划

要点:

动态规划方法与贪心法、分治法的异同;

动态规划方法的基本要素与求解步骤;

动态规划方法的应用。

难点:

如何根据问题的最优子结构性质构造构造动态规划方法中的递归公式或动态规划方程


  • 动态规划的基本思想 
动态规划的实质

1) 分治思想:将原问题分解为更小、更易求解的子问题,然后对子问题进行求解,并最终产生原问题的解。

2) 解决冗余:求解过程中,所有子问题只求解一次并以表的方式保存,对于相同子问题并不重复求解而通过查表的方式获得。

动态规划和分治法的异同

1) 相同:都基于分治思想;

2) 不同:分治法中各个子问题是独立的,而动态规划方法中允许子问题之间存在重叠

  • 动态规划的3个基本要素 

1)最优子结构性质:(F(5)的最优解包括F(4)的最优解)

问题最优解包含其子问题的最优解。为动态规划的基础。基于最优子结构性质导出递归公式或动态规划基本方程是解决一切动态规划问题的基本方法。反证法证明。

2) 子问题重叠性质:(F(3)和F(2)被多次求解)

求解过程中有些子问题出现多次而存在重叠。第一次遇到就加以解决并保存,若再次遇到时无需重复计算而直接查表得到,从而提高求解效率。该性质不是必要条件,但无该性质该方法即没有优势。

3) 自底向上的求解方法:(Fibonacci数的第二种求解方法)

鉴于子问题重叠性质,采用自底向上的方法。先填停止条件,求解每一级子问题并保存,直至得到原问题的解

//斐波那契数列自顶向下递归求解: 
FIB1(n)  
IF n = 0     RETURN 0   
ELSE IF n = 1     RETURN 1   
ELSE RETURN FIB1(n-1) + FIB1(n-2)
//时间复杂性为O(1.618n),空间复杂性为O(n)。
//自底向上求解伪代码: 
FIB2(n)F[0] = 0 //F[0..n]F[1] = 1FOR i = 2 TO nF[i] = F[i-1] + F[i-2]RETURN F[n]
//其时间复杂性为O(n),空间复杂性为O(n)。
  • 动态规划求解的4个基本步骤

 (1)分析最优解的性质,以刻画最优解的结构特征 ——— 考察是否适合采用动态规划方法,即是否具备最优子结构性质

(2)递归定义最优值(即建立递归公式或动态规划方程),包括停止条件(递归出口)和递归体;

(3)以自底向上的方式计算出最优值,并记录相关信息。应充分利用子问题重叠性质;

(4)最终构造出最优解


备忘录方法(动态规划方法的变形)

相同点:用表格保存已经解决的子问题的解,下次需要时直接查表而无需重新计算;

不同点:①备忘录方法采用自顶向下的递归方式,动态规划是采用自底向上的递归方式;

②备忘录的控制结构和直接递归的结构同,区别在于备忘录方法为已有解的子问题建立备忘录待需要时查看;


最长公共子序列LCS问题

设序列X={$ x_1$,$ x_2$,…,$ x_m$}和Y={$y_1$,y_2,…,y_n}的最长公共子序列为Z={z_1,z_2,…,z_k} ,则:

x_m==y_n,则z_k==x_m==y_n,而且z_{k-1}x_{m-1}y_{n-1}的最长公共子序列;

x_my_nz_kx_m,则ZX_{m-1}Y的最长公共子序列;

x_my_nz_ky_ny_n,则ZXY_{n-1}的最长公共子序列。

以上,可以使用反证法进行证明。

LCS满足动态规划的条件:

LCS问题的子问题重叠性质: 在计算X和Y的LCS时,可能需要计算X_{m-1}YXY_{n-1}的LCS,很显然都包含了X_{m-1}Y_{n-1}的LCS。

LCS问题的最优子结构性质建立子问题最优值的递归关系:

用c[i][j]记录序列Xi和Yj的LCS的长度。其中,Xi={x1,x2,…,xi}和Yj={y1,y2,…,yj}分别为序列X和Y的第i个前缀和第j个前缀。 当i=0或j=0时,空序列是Xi和Yj的LCS。此时C[i][j]=0。其他情况下,由最优子结构性质可建立递归关系。

LCS问题的具体设计:

①确定合适的数据结构。采用二维数组c来存放各个子问题的最优解二维数组b记录各子问题最优值的来源(之前的递归公式上所附注的以上3种情况)

②初始化。令c[i][0]=0,c[0][j]=0,其中,0≤i≤m,0≤j ≤n。

③循环阶段。根据递归关系式,确定Xi和Yj的LCS的长度,0≤i≤m。对于每个i循环,0≤j ≤n。

④根据二维数组b记录的信息以自底向上的方式来构造该LCS问题的最优解

//基于DP动态规划求解LCS问题的伪代码如下:
LCS(X,Y)m = length(X)n = length(Y)FOR i = 1 TO mc[i][0] = 0FOR j = 1 TO nc[0][j] = 0FOR i = 1 TO mFOR j = 1 TO nIF X[i] == Y[j]c[i][j] = c[i-1][j-1] + 1b[i][j] = 1ELSE IF c[i-1][j] >= c[i][j-1]      //暗指x[i]!=y[j]  c[i][j] = c[i-1][j] b[i][j] = 3ELSEc[i][j] = c[i][j-1] b[i][j] = 2//else if和else 就是在如果两个字母不匹配 当前位置的状态取左边或者上边的最大值
//对于第一个if 两个字母匹配 当前位置的状态取左斜对角位置+1;
//O(m+n+m*n) -> O(n的平方)
//构造LCS问题最优解的伪代码如下:
LCS-PRINT(b,X,i,j)IF i == 0 OR j == 0 RETURNIF b[i][j] == 1LCS-PRINT(b,X,i-1,j-1)PRINT X[i]ELSE IF b[i][j] == 3LCS-PRINT(b,X,i-1,j)ELSELCS-PRINT(b,X,i,j-1) //b[i][j] == 2
//该算法的时复杂性为O(m+n)-> O(n) 
LCS的其他解决方法:
穷举搜索法

枚举Xm={x1,x2,…,xm}的所有子序列,并逐一检查每个子序列是否也为Yn={y1,y2,…,yn}的子序列,其中最长的即为Xm和Yn的最长公共子序列。

该算法的时复杂性为O(n2^m) -> O(n2^n),指数级;

直接递归法
//直接递归是自顶向下的
LCS-REC(X,Y,i,j,c,b)IF i == 0 OR j == 0 RETURN 0IF X[i] == Y[j]PRINT X[i] RETURN LCS-REC(X,Y,i-1,j-1,c,b) + 1 ELSERETURN MAX(LCS-REC(X,Y,i-1,j,c,b),LCS-REC(X,Y,i,j-1,c,b))

该算法的时复杂性为O(22^{min(m,n))}) -> O(2^n),指数级;


矩阵连乘

给定n个矩阵{A1, A2, A3, …, An},其中Ai与Ai+1 (i=1,2,3, …,n-1)是可乘的。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积所需要的数乘次数最少。

穷举法

设n个矩阵连乘的不同计算次序数为P(n)。每种加括号方式都可分解为两个子矩阵的加括号问题:(A1...Ak)(Ak+1…An):

动态规划方法

性质:最优子结构性质--反证法;

计算A[i:j]的最优次序所包含的计算矩阵子链 A[i:k]和A[k+1:j]的次序也是最优的:

设计算A[i:j],1≤i≤j≤n,所需要的最少数乘次数m[i,j],则原问题的最优值为m[1,n];

当i=j,A[i:j]=A[i:i]。因此,m[i,i]=0,i=1,2,…,n;

当i<j,m[i,j] = m[i,k]+m[k+1,j]+p_{i-1}p_kp_jA_i维数为P_{i-1} x P_i

//递归求解矩阵连乘问题的伪代码:
RECURSIVE-MATRIX-CHAIN(p,i,j,m,s)IF i == jm[i,j] = 0, s[i,j] = 0RETURNm[i,j] = ∞FOR k = i TO j-1q = RECURSIVE-MATRIX-CHAIN(p,i,k,m,s)+ RECURSIVE-MATRIX-CHAIN(p,k+1,j,m,s)+ pi-1pkpjIF q < m[i,j]m[i,j] = qs[i,j] = kRETURN m AND s
//采用DP求解矩阵连乘问题的伪代码:
MATRIX-CHAIN-ORDER-DP(n,p,m,s) //p[1..n+1]为n个矩阵的维数//m[1..n, 1..n]为最优值,s[1..n, 1..n]为最优决策FOR i = 1 TO nm[i,i] = 0FOR l = 2 TO n //l为链的长度FOR i = 0 TO n-l+1j = i+l-1m[i,j] = ∞FOR k = i TO j-1q = m[i,k] + m[k+1,j] + pi-1pkpjIF q < m[i,j]m[i,j] = qs[i,j] = kRETURN m AND s
//时间复杂度是n的三次方;空间复杂度是O(1);//采用DP求解矩阵连乘问题的伪代码:
MATRIX-CHAIN-ORDER-DP(n,p,m,s) //p[1..n+1]为n个矩阵的维数//m[1..n, 1..n]为最优值,s[1..n, 1..n]为最优决策FOR i = 1 TO nm[i,i] = 0FOR l = 2 TO n //l为链的长度FOR i = 0 TO n-l+1j = i+l-1m[i,j] = ∞FOR k = i TO j-1q = m[i,k] + m[k+1,j] + pi-1pkpjIF q < m[i,j]m[i,j] = qs[i,j] = kRETURN m AND s
//时间复杂性 O(n) ;空间复杂性:O(n)//主程序:
MATRIX-CHAIN-ORDER-DP-MAIN(p,n)//m[1..n, 1..n]为最优值,    //s[1..n, 1..n]为最优决策(m,s) = MATRIX-CHAIN-ORDER-DP(n,p,m,s)PRINT-OPTIMAL-PARENS(s,1,n)
// 时间复杂性:O(n3)  空间复杂性:O(n2)

算法设计与分析——矩阵连乘问题(动态规划) - 王陸 - 博客园 (cnblogs.com)

0-1背包问题 

动态规划

n个物品和1个背包。对物品i,其价值为vi,重量为wi,背包容量为W。如何选取物品装入背包,使背包中所装入的物品的总价值最大?其中,wi, W都是正整数。

 最优子结构性质:

设 (x1, x2,…, xn) 是所给0-1背包问题的一最优解,则 (x2,…, xn) 是下面相应子问题的一个最优解

//采用DP求解0-1背包问题的伪代码:
KNAPSACK-01-DP(w, v, W) //w为重量,v为价值,W为容量//C[1..n, 1..n]为最优值--最大价值FOR i = 1 TO nC[i,0] = 0FOR j = 1 TO W                   //可用容量C[0,j] = 0FOR i = 1 TO nFOR j = 1 TO WIF j < w[i]C[i,j] = C[i-1][j]         //装不下第i个物品ELSEC[i,j] = MAX{C[i-1][j],C[i-1][j-w[i]] + v[i]}   //在装下第i个物品和不装的价值最大判断 RETURN C //时间复杂度是O(nW) 空间复杂度O(1);//0-1背包问题的最优解构建的伪代码:
KNAPSACK-TRACEBACK-01(w,W,C,X) //w为重量,W为容量,C为最优值//X[1..n]为构建的最优解 -- 选择哪个物品放进背包;n = w.length – 1j = W                              //可用容量FOR i = n TO 1IF C[i][j] == C[i-1][j]X[i] = 0                  //现在这个物品的价值和上一个一样就不放入 ELSE                          X[i] = 1                   //放入,可用容量减去当前物品重量;j -= w[i]RETURN X
//时间复杂度是O(n)  空间复杂度是O(1);//主程序:
KNAPSACK-01-DP-MAIN(w,v,W) //w为重量,v为价值,W为容量KNAPSACK-01-DP(w,v,W,C)        --C存背包价值的最大化//X[1..n]为构建的最优解KNAPSACK-TRACEBACK(w,v,W,C,X)  --X存物品的有无
//时间复杂性:O(nW)。空间复杂性:O(nW);

贪心算法

在不超过背包的容量的情况下,尽可能多(指重量,如全部或部分)地选择更为贵重(指单位重量的价值最大)的物品,直至装满背包为止。

//基于贪心法求解背包问题的伪代码如下:
GREEDY-KNAPSACK(w, v, W) //w为重量,v为价值,W为容量SORT-ASC-BY-V(v,w) //按照物品的单位价值非降序排序,同时调整v和wn = w.length//x[1..n]为最优值,存放已选物品的相应重量。各元素初始化为0wRemained = W           //剩余重量是WFOR i = 1 TO n          IF wRemained <= 0       //无剩余重量 BREAK;ELSE IF wRemained >= w[i]   x[i] = 1            //存入wRemained = W – w[i]ELSEx[i] = 0            //不存入BREAKRETURN x

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

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

相关文章

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验9 IPv4地址 — 划分子网

一、实验目的 1.学习划分子网的方法&#xff1b; 2.验证子网掩码的作用。 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.划分子网&#xff1b; …

vscode_cmake_stm32_lvgl移植及显示优化

1 LVGL移植 本文使用的环境如下&#xff1a; STM32H743FreeRTOSst7789 lcd(320*240) 下载 LVGL源码&#xff0c;本文使用Release v9.1.0&#xff1b; 将压缩包解压到工程目录&#xff0c;例如stm32h7xx_cmake_project/components/lvgl-9.1.0&#xff0c;如下所示&#xff1a; …

算法04 模拟算法之一维数组相关内容详解【C++实现】

大家好&#xff0c;我是bigbigli&#xff0c;模拟算法我们将分为几个章节来讲&#xff0c;今天我们只看一维数组相关的题目 目录 模拟的概念 训练&#xff1a;开关灯 解析 参考代码 训练&#xff1a;数组变化 解析 参考代码 训练&#xff1a;折叠游戏 解析 参考代码 …

[leetcode]rotate-array 轮转数组

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:void reverse(vector<int>& nums, int start, int end) {while (start < end) {swap(nums[start], nums[end]);start 1;end - 1;}}void rotate(vector<int>& nums, int k) {k % num…

酷开系统丨酷开科技AI赋能数字大屏,开启智能家居新纪元

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的崛起无疑为科技领域带来了革命性的变化。酷开科技&#xff0c;正以其独特的"AI数字大屏"战略&#xff0c;将创新理念转化为现实&#xff0c;引领行业发展新潮流。 酷开科技的智能电视操作系统…

BarTender版软件下载及安装教程

​根据行业数据显示强大的配套应用软件甚至能够管理系统安全性、网络打印功能、文档发布、打印作业记录等&#xff0c;为满足不同的需要和预算&#xff0c;BarTender 提供四个版本&#xff0c;每个都拥有卓越的功能和特性。根据软件大数据显示多国语言支持&#xff1a;轻松设计…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《兼顾配电网韧性提升的电动汽车换电站容量优化配置方法 》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

6.25长难句打卡

“Carry a book with you at all times” can actually work, too—providing you dip in often enough, so that reading becomes the default state from which you temporarily surface to take care of business, before dropping back down. “随时随身携带书籍”实际上也…

【Launcher3】解决谷歌桌面的小部件重启后消失问题

1-问题摘要 这次主要解决困扰了我很久的时钟消失问题&#xff0c;大概是去年10月刚开始做EDLA项目的时候&#xff0c;需要定制谷歌桌面&#xff0c;桌面布局大概要改成这样&#xff1a; 时间显示在谷歌搜索框的上方,而安卓原生桌面大概是这样子的 我们开发一开始是使用小部件…

web刷题记录

[HDCTF 2023]SearchMaster 打开环境&#xff0c;首先的提示信息就是告诉我们&#xff0c;可以用post传参的方式来传入参数data 首先考虑的还是rce&#xff0c;但是这里发现&#xff0c;不管输入那种命令&#xff0c;它都会直接显示在中间的那一小行里面&#xff0c;而实际的命令…

视觉与运动控制6

基于驱动器的控制功能 驱动器的系统性能和运算能力有限需要单独的运动控制器。 V/F恒压频比控制 开环控制方法&#xff0c;应用最广泛、最简单&#xff0c;只需要电机数据即可。适用于控制精度和动态响应要求不高的应用。控制原理&#xff1a;保持点击内磁通量恒定&#xff…

Emacs之显示blame插件:blamer、git-messenger(一百四十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【ARMv8/v9 GIC 系列 2.3 -- GIC SPI 中断的 GICD_CLRSPI_NSR寄存器】

文章目录 GICD_CLRSPIN_NSR寄存器功能INTID 位 [12:0]中断触发类型的影响小结 GICD_CLRSPIN_NSR 在 ARMv9 架构下&#xff0c;GIC&#xff08;Generic Interrupt Controller&#xff09;是负责中断管理的关键组件&#xff0c;它支持复杂的中断处理需求&#xff0c;包括多处理器…

免费下载电子书的网站

在如今的数字化时代&#xff0c;电子书已成为许多人书籍阅读的首选。下面小编就和大家分享一些提供免费查找下载电子书服务的网站&#xff0c;这些网站不仅资源丰富&#xff0c;而且操作简便。 免费下载电子书的网站&#xff1a;https://www.bgrdh.com/favorites/1355.html 1…

没有查到相同已注册商标名称,就可以注册下来?

曾聊了许多网友&#xff0c;他们对普推商标知产老杨说&#xff0c;认为没有查到相同已注册商标名称&#xff0c;就可以申请注册成功&#xff0c;其实不是这样的&#xff0c;还要考虑多种因素。 有的商标名称起的很长&#xff0c;是广告语&#xff0c;一检索没有相同&#xff0…

ChatGPT API技术教程OpenAI APIKey在线对接-Chat Completion对象

表示模型根据提供的输入返回的聊天完成响应。 {"id": "chatcmpl-123","object": "chat.completion","created": 1677652288,"model": "gpt-3.5-turbo-0125","system_fingerprint": "fp…

net Framework OAuth2.0

安装四个包 密码模式&#xff08;Password Grant&#xff09;&#xff1a; 用户将用户名和密码发送给第三方应用程序&#xff0c;第三方应用程序直接向授权服务器请求访问令牌。

密码学:用随机函数隐藏指纹

英文中e的出现频率高&#xff0c;加密后&#xff0c;频率最高的那个符号代表e。这是历史上的一次真实案例。这些符号的概率&#xff0c;叫做“指纹”。 把e加密成2个符号&#xff0c;用随机函数选择&#xff0c;例如70%概率下选择符号1&#xff0c;30%选择符号2。解密时&#…

Web Worker 学习及使用

了解什么是 Web Worker 提供了可以在后台线程中运行 js 的方法。可以不占用主线程&#xff0c;不干扰用户界面&#xff0c;可以用来执行复杂、耗时的任务。 在worker中运行的是另一个全局上下文&#xff0c;不能直接获取 Window 全局对象。不同的 worker 可以分为专用和共享&…

文心一言使用笔记

目录 让文心一言提炼已有的内容&#xff0c;模仿给出的案例写一段宣传稿方法例子 发现写出的内容有瑕疵&#xff0c;如何微调&#xff1f;比如文心一言介绍的领导不全如何让文心一言检查语法和表达问题&#xff1f; 如何让文心一言将每个片段用一两句话总结&#xff1f;为了防止…