【算法分析与设计】动态规划(上)

简介: 【算法分析与设计】动态规划(上)

一、学习要点

  理解动态规划算法的概念

  掌握动态规划算法的基本要素

  (1)最优子结构性质

  (2)重叠子问题性质

  掌握设计动态规划算法的步骤

  (1)找出最优解的性质,并刻划其结构特征

  (2)递归地定义最优值

  (3)以自底向上的方式计算出最优值

  (4)根据计算最优值时得到的信息,构造最优解

  通过应用范例学习动态规划算法设计策略。

  (1)矩阵连乘问题

  (2)最长公共子序列;

  (3)最大子段和

  (4)凸多边形最优三角剖分;

  (5)多边形游戏;

  (6)图像压缩;

  (7)电路布线;

  (8)流水作业调度;

  (9)背包问题;

  (10)最优二叉搜索树。


二、算法总体思想

  动态规划算法与分治法类似,其 基本思想也是将待求解问题分解成若干个子问题

  但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次

  如果 能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。


三、动态规划基本步骤

  找出最优解的性质,并刻划其结构特征

  递归地定义最优值

  以自底向上的方式计算出最优值

  根据计算最优值时得到的信息,构造最优解


四、矩阵连乘问题

  问题:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2,…n-1。我们要计算出这 n个矩阵的连乘积

  因为矩阵乘积满足结合律,所以哪两个矩阵先乘哪两个后乘结果是一样的,但是 计算次数不一样,我们要找计算次数最小的那个次序!


4.1 完全加括号的矩阵连乘积

  完全加括号的矩阵连乘积可递归地定义为:

  设有四个矩阵A,B,C,D;它们的维数分别是:

  总共有五中完全加括号的方式:

  16000, 10500, 36000, 87500, 34500

  给定n个矩阵:其中Ai与Ai+1是可乘的,i=1,2,…,n-1。考察这n个矩阵的连乘积

  由于 矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。

  若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积

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


4.2 穷举法

  列举出所有可能的计算次序,并计算出每一种计算次序相应需要的数乘次数,从中找出一种数乘次数最少的计算次序。

  算法复杂度分析

  对于n个矩阵的连乘积,设其不同的计算次序为P(n)。

  由于每种加括号方式都可以分解为两个子矩阵的加括号问题:(A1…Ak)(Ak+1…An)可以得到关于P(n)的递推式如下:


4.3 动态规划

  将矩阵连乘积AiAi+1…Aj简记为A[i:j],这里i≤j

  考察计算A[i:j]的最优计算次序。设 这个计算次序在矩阵
Ak和Ak+1之间将矩阵链断开
,i≤k<j,则其相应完全加括号方式为

  计算量:A[i:k]的计算量加上A[k+1:j]的计算量,再加上A[i:k]和A[k+1:j]相乘的计算量。


4.3.1 分析最优解的结构

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

  矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质问题的最优子结构性质是该问题可用动态规划算法求解的显著特征


4.3.2 建立递归关系

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

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

  当i<j时,

  可以递归地定义m[i,j]为:

  (k的位置只有j-i种可能)


4.3.3 计算最优值

  对于1≤i≤j≤n不同的有序对(i,j)对应于不同的子问题。因此,不同子问题的个数最多只有

  由此可见,在递归计算时,许多子问题被重复计算多次。这也是该问题可用动态规划算法求解的又一显著特征。

  用动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算。在计算过程中,保存已解决的子问题答案每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法

  1.计算A1,A2,A3,A4,A5,A6

  2.计算(A1A2),(A2A3),(A3A4),(A4A5),(A5A6)

  3.计算(A1A2A3),…,(A4A5A6)

  4.计算A[1,4],A[2,5],A[3,6]

  5.计算A[1,5],A[2,6]

  6.计算A[1,6]


4.3.4 用动态规划法求最优解

void MatrixChain(int *p,int n,int **m,int **s)
{
        for (int i = 1; i <= n; i++) m[i][i] = 0;
        for (int r = 2; r <= n; r++)
           for (int i = 1; i <= n - r+1; i++) {
              int j=i+r-1;
              m[i][j] = m[i+1][j]+ p[i-1]*p[i]*p[j];
              s[i][j] = i;
              for (int k = i+1; k < j; k++) {
                 int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
                 if (t < m[i][j]) { m[i][j] = t; s[i][j] = k;}
              }
          }
}

  算法复杂度分析

  算法matrixChain的主要计算量取决于算法中对r,i和k的3重循环。循环体内的计算量为O(1),而3重循环的总次数为O(n3)。因此算法的计算时间上界为O(n3)。算法所占用的空间显然为O(n2)。


五、动态规划算法的基本要素

5.1 最优子结构

  矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质

  在分析问题的最优子结构性质时,所用的方法具有普遍性:首先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾

  利用问题的最优子结构性质,以自底向上的方式 递归地从子问题的最优解逐步构造出整个问题的最优解最优子结构是问题能用动态规划算法求解的前提

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


5.2 重叠子问题

  递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质

  动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果

  通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率


5.3 备忘录方法

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

int LookupChain(int i,int j)
{
       if (m[i][j] > 0) return m[i][j];
       if (i == j) return 0;
       int u = LookupChain(i,i) + LookupChain(i+1,j) + p[i-1]*p[i]*p[j];
       s[i][j] = i;
       for (int k = i+1; k < j; k++) {
         int t = LookupChain(i,k) + LookupChain(k+1,j) + p[i-1]*p[k]*p[j];
         if (t < u) { u = t; s[i][j] = k;}
         }
       m[i][j] = u;
       return u;
}

六、思考题:捡硬币问题

  现有n个硬币按顺序依次排列在你面前,可以看为一个数组coins[]={5,1,2,10,6,2},请在此中捡取若干个硬币,使得所取硬币累加值最大,捡取个数不限,但相邻两个硬币不得捡取,请设计相应算法,并输出累加值

  提示:硬币面值必须是正数,不能有负值。建立数组dp[i]存储选取前i个硬币的累加值


相关文章
|
1月前
|
机器学习/深度学习 存储 算法
动态规划算法深度解析:0-1背包问题
0-1背包问题是经典的组合优化问题,目标是在给定物品重量和价值及背包容量限制下,选取物品使得总价值最大化且每个物品仅能被选一次。该问题通常采用动态规划方法解决,通过构建二维状态表dp[i][j]记录前i个物品在容量j时的最大价值,利用状态转移方程避免重复计算子问题,从而高效求解最优解。
288 1
|
1月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
164 3
|
4月前
|
机器学习/深度学习 边缘计算 算法
NOMA和OFDMA优化算法分析
NOMA和OFDMA优化算法分析
262 127
|
6月前
|
数据采集 机器学习/深度学习 算法
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
356 4
|
28天前
|
存储 边缘计算 算法
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
|
2月前
|
机器学习/深度学习 算法 5G
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
118 0
|
3月前
|
编解码 算法 5G
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
245 2
|
3月前
|
人工智能 自然语言处理 算法
2025 年 7 月境内深度合成服务算法备案情况分析报告
2025年7月,中央网信办发布第十二批深度合成算法备案信息,全国389款产品通过备案,服务提供者占比超七成。截至7月14日,全国累计备案达3834款,覆盖文本、图像、音视频等多模态场景,广泛应用于生活服务、医疗、金融等领域。广东以135款居首,数字人、AI客服等C端应用主导,民营企业成主力,国企聚焦公共服务。随着AI政策推动,备案已成为AI产品合规上线关键环节。
|
6月前
|
存储 监控 算法
员工行为监控软件中的 Go 语言哈希表算法:理论、实现与分析
当代企业管理体系中,员工行为监控软件已逐步成为维护企业信息安全、提升工作效能的关键工具。这类软件能够实时记录员工操作行为,为企业管理者提供数据驱动的决策依据。其核心支撑技术在于数据结构与算法的精妙运用。本文聚焦于 Go 语言中的哈希表算法,深入探究其在员工行为监控软件中的应用逻辑与实现机制。
158 14
|
7月前
|
自然语言处理 算法 安全
境内深度合成服务算法备案通过名单分析报告
本报告基于《境内深度合成服务算法备案通过名单》,分析了2023年6月至2025年3月公布的10批备案数据,涵盖属地分布、行业应用及产品形式等多个维度。报告显示,深度合成算法主要集中于经济发达地区,如北京、广东、上海等地,涉及教育、医疗、金融、娱乐等多行业。未来趋势显示技术将向多模态融合、行业定制化和安全合规方向发展。建议企业加强技术研发、拓展应用场景、关注政策动态,以在深度合成领域抢占先机。此分析旨在为企业提供参考,助力把握技术发展机遇。
境内深度合成服务算法备案通过名单分析报告

热门文章

最新文章