2011算法3_动态规划法
《算法设计与分析》第3章 动态规划法

最优解的递推关系 定义m[i:j],表示矩阵连乘A[i:j]所需的最少计算 量 则有: i j 0 m[i ][ j ] i j minj{m[i ][ k ] m[k 1][ j ] pi 1 pk p j } i k
假设:N个矩阵的维数依序放在一维数组p中, 其中Ai的维数记为Pi-1×Pi
A=A1×A2×A3×…×An
A=(A1×A2×…×Ak) × (Ak+1×Ak+2×…×An)
B
C
1.2 穷举法
穷举法:列举出所有可能的计算次序,并计算出 每一种计算次序相应需要的数乘次数,从中找出 一种数乘次数最少的计算次序。
穷举法复杂度分析: 对于n个矩阵的连乘积,设其不同的计算次序有P(n)种。 由于每种加括号方式都可以分解为两个子连乘的加括号问题: (A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下:
【程序】矩阵连乘的 穷举法实现 int MatrixChain::LookupChain(int i, int j) { if(i==j) return 0; int u=LookupChain(i+1,j)+p[i-1]*p[i]*p[j]; //k=i s[i][j]=i; //记录最优分解位置 for ( int k=i+1;k<j; k++ ) { //遍历k int t=LookupChain(i,k)+LookupChain(k+1,j) +p[i]*p[k+1]*p[j+1]; if (t<u) { u=t; s[i][j]=k; //记录最优分解位置 } } int MatrixChain::LookupChain() return u; { } return LookupChain(1,n);
《动态规划法》课件

动态规划法的发展趋势
混合整数动态规划
将整数变量引入动态规划中,解决更复杂的问题 ,如组合优化问题。
动态规划与机器学习结合
利用机器学习算法辅助动态规划求解,提高算法 的效率和准确性。
ABCD
多目标动态规划
考虑多个相互冲突的目标,寻求最优解的权衡。
分布式动态规划
将问题分解为多个子问题,在分布式系统中并行 求解,提高大规模问题的处理能力。
排班问题
总结词
动态规划法可以用于解决排班问题,使得员工的工作计 划安排最优。
详细描述
排班问题是一个多约束优化问题,涉及到员工的工作时 间、班次、休息时间等多个因素。通过构建状态转移方 程和优先级规则,动态规划法能够求解出满足所有约束 条件的最佳排班方案。
生产调度问题
总结词
动态规划法可以应用于生产调度问题,优化生产流程 和资源分配。
策略
一系列决策的集合,表示从初始状态到终止状态的整个求解过程。
转移方程与最优解
转移方程
描述状态转移的数学方程,表示从一个状态转移到另一个状 态的关系。
最优解
在所有可能的策略中,能够使目标函数达到最优值的策略。
03
动态规划法的求解步骤
问题的分解
总结词
将复杂问题分解为若干个子问题
详细描述
动态规划法首先将原问题分解为若干个子问题,每个子问题都是原问题的简化版本。通过解决这些子 问题,可以逐步推导出原问题的解决方案。
02
动态规划法的基本概念
阶段与状态
01
阶段
将问题的求解过程划分为若干个 相互联系的阶段,以便按一定的 次序进行求解。
02
03
状态
状态转移
在某一时刻,问题所处的情况或 状态。
动态规划法

d(1, {2, 3})=min{c12+d(2, {3}), c13+ d(3, {2})}=min{2+5, 3+11}=7(1→2) d(2, {1, 3})=min{c21+d(1, {3}), c23+ d(3, {1})}=min{4+6, 2+12}=10(2→1) d(3, {1, 2})=min{c31+d(1, {2}), c32+ d(2, {1})}=min{7+8, 5+9}=14(3→2) 最后有:
算法设计与分析
假设从顶点i出发,令d(i, V')表示从顶点i出发经过
V'中各个顶点一次且仅一次,最后回到出发点i的最
短路径长度,开始时,V'=V-{i},于是,TSP问
题的动态规划函数为:
d(i,V')=min{cik+d(k,V-{k})}(k∈V') (式6.5)
d(k,{})=cki(k≠i)
并且
i 1
n
d min xi i 1
(式6.4)
在付款问题中,集合P是该问题的输入,满足式6.1的 解称为可行解,式6.2是解的表现形式,因为向量X中有n个 元素,每个元素的取值为0或1,所以,可以有2n个不同的 向量,所有这些向量的全体构成该问题的解空间,式6.3是 该问题的约束条件,式6.4是该问题的目标函数,使式6.4取 得极小值的解称为该问题的最优解。
清华大学出版社
动态规划法的求解过程
原问题
算法设计与分析
子问题1
子问题2 ……
子问题n
填表 原问题的解
清华大学出版社
例:计算斐波那契数:
第七章 动态规划法2(算法分析与设计课件)

m=
0 15750 7875 9735 11875 15125
0 2625 4375 712510500
0 750 2500 5375 0 1000 3500
的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出 比原问题最优解更好的解,从而导致矛盾。
利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐 步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。
(2)子问题的重叠性质:每次产生的子问题并不都是新的子问题,有些子问题 被反复计算多次,这种性质称为子问题的重叠性质。
7
7.1 一般方法和基本要素
例2:多段图问题:求从s到t的一条长度最短的路径
(3)多段图的向前递推关系式
cost(k,t) 0 cost(i, j) min {c( j, p) cost(i 1, p)} 1 i k 1
jVi, pVi1 j, pE
其中,cost(i,j)是从i阶段状态j到t的最短路径的长度,i是阶段编号,j 是第i阶段的一个状态编号.
在s[i][j]中记录使得下式取得最小值的k.
m[i, j] min {m[i, k] m[k 1, j] pi pk1p j1}
ik j
7.3 矩阵连乘 A0 A1 A2 A3 A4 A5 3035 3515 155 510 1020 2025
7.3.2 动态规划法求解
动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中, 当再次需要解此子问题时,只是简单地用常数时间查看一下结果。
动态规划算法的实施步骤

动态规划算法的实施步骤1. 算法介绍动态规划是一种常用的求解最优化问题的方法,它适用于求解具有重叠子问题特性的问题。
动态规划算法通过将问题拆分成小问题,并保存这些小问题的解来减少重复计算,从而提高求解效率。
2. 实施步骤步骤一:定义问题的状态在动态规划算法中,第一步是定义问题的状态。
问题的状态是指问题的子问题中需要求解的变量或指标。
这些状态一般可以用一个或多个变量来表示。
步骤二:确定状态转移方程确定状态转移方程是动态规划算法的核心步骤。
状态转移方程可以根据问题的特点和定义的状态来确定。
状态转移方程描述了问题的当前状态和下一个状态之间的关系。
步骤三:确定初始状态初始状态是指问题的最小规模的子问题的解,也就是边界条件。
初始状态的确定需要根据具体问题来定义。
步骤四:计算最优解根据定义的状态转移方程和初始状态,可以通过自底向上(bottom-up)或自顶向下(top-down)的方式,计算出问题的最优解。
步骤五:返回最优解最后一步是返回计算得到的最优解。
根据问题的特点和需求,最优解可以是一个值,也可以是一组值。
3. 实施示例为了更好地理解动态规划算法的实施步骤,下面以求解斐波那契数列为例进行说明。
步骤一:定义问题的状态在求解斐波那契数列的问题中,状态可以定义为第n个斐波那契数F(n)。
步骤二:确定状态转移方程斐波那契数列的状态转移方程为F(n) = F(n-1) + F(n-2)。
步骤三:确定初始状态斐波那契数列的初始状态可以定义为F(0) = 0,F(1) = 1。
步骤四:计算最优解根据状态转移方程和初始状态,可以通过自底向上的方式计算斐波那契数列的最优解。
def fibonacci(n):if n ==0:return0elif n ==1:return1else:dp = [0] * (n+1)dp[0] =0dp[1] =1for i in range(2, n+1):dp[i] = dp[i-1] + dp[i-2]return dp[n]步骤五:返回最优解在上述示例中,最优解为fibonacci(n),即第n个斐波那契数。
算法分析与设计课件:动态规划法

动态规划问世以来,在经济管理、生产调度、 工程技术和最优控制等方面得到了广泛的应用。 例如最短路线、资源分配、设备更新等问题, 用动态规划比用其它方法求解更为方便。
2022/2/14
4 of 158
方法概述: 发展及研究内容
虽然动态规划主要用于求解以时间划分阶段的 动态过程的优化问题,但是一些与时间无关的 静态规划(如线性规划、非线性规划),可以人为 地引进时间因素,把它视为多阶段决策过程, 也可以用动态规划方法方便地求解。
2022/2/14
5 of 158
方法概述: 基本思想
Bellman给出这个原理作为动态规划的适用条 件,后来Morin在1982年证明了这只是一个充 分条件而非必要条件。Bellman的原定义如下:
An optimal policy has the property that whatever the initial state and initial decision are, then remaining decisions must constitute an optimal policy with regard to the state resulting from first decision.
时再查找,这样就可以避免重复计算、节省时
间。动态规划法用一个表来记录所有已解的子
问题的答案。 2022/2/14
6 of 158
方法概述: 求解步骤
1、找出最优解的性质,并刻画其结构特征; 2、递归地定义最优值(写出动态规划方程); 3、以自底向上的方式计算出最优值; 4、根据计算最优值时记录的信息,构造最优解。 注: -步骤1-3是动态规划算法的基本步骤。在只需要
动态规划算法详解及经典例题
动态规划算法详解及经典例题⼀、基本概念(1)⼀种使⽤多阶段决策过程最优的通⽤⽅法。
(2)动态规划过程是:每次决策依赖于当前状态,⼜随即引起状态的转移。
⼀个决策序列就是在变化的状态中产⽣出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。
假设问题是由交叠的⼦问题所构成,我们就能够⽤动态规划技术来解决它。
⼀般来说,这种⼦问题出⾃对给定问题求解的递推关系中,这个递推关系包括了同样问题的更⼩⼦问题的解。
动态规划法建议,与其对交叠⼦问题⼀次重新的求解,不如把每⼀个较⼩⼦问题仅仅求解⼀次并把结果记录在表中(动态规划也是空间换时间的)。
这样就能够从表中得到原始问题的解。
(3)动态规划经常常使⽤于解决最优化问题,这些问题多表现为多阶段决策。
关于多阶段决策:在实际中,⼈们经常遇到这样⼀类决策问题,即因为过程的特殊性,能够将决策的全过程根据时间或空间划分若⼲个联系的阶段。
⽽在各阶段中。
⼈们都须要作出⽅案的选择。
我们称之为决策。
⽽且当⼀个阶段的决策之后,经常影响到下⼀个阶段的决策,从⽽影响整个过程的活动。
这样,各个阶段所确定的决策就构成⼀个决策序列,常称之为策略。
因为各个阶段可供选择的决策往往不⽌⼀个。
因⽽就可能有很多决策以供选择,这些可供选择的策略构成⼀个集合,我们称之为同意策略集合(简称策略集合)。
每⼀个策略都对应地确定⼀种活动的效果。
我们假定这个效果能够⽤数量来衡量。
因为不同的策略经常导致不同的效果,因此,怎样在同意策略集合中选择⼀个策略,使其在预定的标准下达到最好的效果。
经常是⼈们所关⼼的问题。
我们称这种策略为最优策略,这类问题就称为多阶段决策问题。
(4)多阶段决策问题举例:机器负荷分配问题某种机器能够在⾼低两种不同的负荷下进⾏⽣产。
在⾼负荷下⽣产时。
产品的年产量g和投⼊⽣产的机器数量x的关系为g=g(x),这时的年完善率为a,即假设年初完善机器数为x,到年终时完善的机器数为a*x(0<a<1);在低负荷下⽣产时,产品的年产量h和投⼊⽣产的机器数量y的关系为h=h(y)。
第九章动态规划法
第九章 动态规划法
动态规划法是求解控制变量限制在一定闭集内的最优控制问题 的又一种重要方法,它是由美国学者贝尔曼于1957年提出来的。 动态规划法把复杂的最优控制问题变成多级决策过程的递推函数关 系,它的基础及核心是最优性原理。本章首先介绍动态规划法的基 本概念,然后讨论如何用动态规划法求解离散及连续系统的最优控 制问题。
N 1
J x k ,uk k 0
(9-7)
现在要求选择 u0,u1,L ,uk 1使性能指标 J N 达最小,这就
是 N 级决策问题。我们可以应用动态规划法来求解。根据最优性原
理,对 N 级最优决策过程来说,不论第一级控制向量 u0 怎样选 定,余下的 N 1级过程,从 u0 产生的状态 x 1 f x 0,u0 作为
E2
C1 D1 F
E1
C1 D2 F
E2
C2 D1 F
E1
C2 D2 F
E2
C2 D3 F
E2
C3 D1 F
E1
C3 D2 F
E2
C3 D3 F
14 5 5 7 12 8 4 12 4 7 11 6 7 13 448 4 7 11 279
比较可得分别从 C1,C2,C3出发时的三条最短路线,它们为:
⑵ 采取逐级分析的方法,一般由最后一级开始倒向进行。
⑶ 在每一级决策时,不只考虑本级的性能指标的最优,而是同 时考虑本级及以后的总性能指标最优,因此它是根据“全局”最优 来作出本级决策的。
算法与设计:动态规划法
求从A到E的最短路问题Fk(A) ,可以转化为两个性质完全相 同,但规模较小的问题,即分别从B1、B2到E的最短路问题 Fk(B1)和Fk(B2),这时有: Fk(A)=min{d1(A,B1)+ Fk(B1),d1(A,B2)+ Fk(B2)} 同样, 计算Fk(B1) ,又可以转化为性质完全相同,但规模更小的 问题,即分别从C1、C2、C3到E的最短路问题Fk(C1)、 Fk(C2) 和 Fk(C3),……,最后,归结为Fk(D1)、 Fk(D2)两个子问题。 由于Fk(D1)、 Fk(D2)是已知的,因此,可以从这两个值开始, 逆向递归计算出Fk(A)的值。最终,可以得到从A到E的最短路径。 动态规划法就是根据最优性原理,以自底向上的方式从子问题 的最优解逐步构造出整个问题的最优解。(逆向递归的方法)
多阶段决策过程最优化问题
图中每个顶点代表一个城市,两个城市间的连线代表道 路,连线上的数值代表道路的长度。现在,想从城市A到达城 市E,怎样走路程最短,最短路程的长度是多少?
最短路径的特性:最短路径的第k阶段通过Xk 点,则 这一最短路径在由Xk 出发到终点的那一部分路径, 对于起始点为Xk 到终点的所有可能的路径来说必定 也是路径最短的.
算法设计与分析
第
3章
动态规划法
广东白云学院 计算机科学系
2010-2011学年 第2学期
本 章 目 录
3.1 概 述 3.2 图问题中的动态规划法 3.3 组合问题中的动态规划法
3.4 查找问题中的动态规划法
返回
3.1 概 述
3.1.1 动态规划法简介 3.1.2 最优化问题 3.1.3 最优性原理 3.1.4 动态规划法的设计思想
S1
P2
程序设计方法——动态规划法
思路(续)
显然,根据前面的递推过程求解,需要倒 过来,从P(D),P(E),P(F)出发,先求出第1阶 段的P(B)和P(C),最后得到P(A)。
数据结构
将长满桃子的树用二维数组保存
数组行上存放桃树上一层中每个树枝上桃子数 将节点上桃子数目存放在数组中 只使用数组中对角线及下部分 A:1
y
A1 B2 C9 E6 F5 I6 J4 x
7 D
G2
3 H
将底层到每个点的最长路径P也存放在二维 数组中
数据结构(续)
#define MAXLAYER 3 int peachtree[MAXLAYER][MAXLAYER] = { {1, -1, -1, -1}, {2, 9, -1, -1}, {7, 6, 5, -1}, {2, 3, 6, 4} }; int P[MAXLAYER][MAXLAYER]
1
B:2 C:9
2 7
9 6 5
D:7 E:6 F:5
2
3
6
4
G:2
H:3
I:6
J:4
问题分析
从二维数组最下面一行开始向 上一行沿图中的直线前进,走 到左上角的格子停止。 行走路径上经过的格子中的数 字之和是猴子爬到树顶能拿到 桃子的数目,我们定义为路径 长度。 原问题转化为求所有路径中路 径长度的最大值。
参考程序(续)
//初始化P[x][0] for (i = 0; i < n; i++) { P[i][0] = peachtree[i][0]; } //递推过程P[x][y] = max{P[x][y-1], P[x+1][y-1]}+peachtree[x][y] for (j = 1; j < n; j++) // i是行号,j是列号 { for (i = 0 ; i + j < n; i++) { P[i][j] = maxnum(P[i][j-1], P[i+1][j-1])+peachtree[i][j]; } } cout << P[0][n-1] << endl; return 0; }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MatrixChain的运行举例
MatrixChain用矩阵m[i][j],2A3A4A5A6,其维数分别 当r=2,执行第(5)句完成了相邻矩阵A[i][i+1]=p[i–1]*p[i]*p[j] 设要计算矩阵连乘积A1A s[i][j]存放子问题A[i: MatrixChain将如下面红色箭头所示的过程逐个计算 当r=3,i=2时,执行第(5)句计算A[2:2][3:4],m[2][4] = 当r=3,i=1时,执行第(5)句计算A[1:1][2:3], m[1][3]= j] 当r=3,i=3时,执行第(5)句计算A[3:3][4:5],m[3][5] = 执行for (int i = 1; i <= n; i++) m[i][i] = 0后将对角线元素全 类似的,当r=4、5、6时,可以计算出相应的m[i][j]及其相 由m[1][6]=15125可知这6个矩阵连乘积的最小运算次数为 当r=3,i=4时,执行第(5)句计算A[4:4][5:6],m[4][6] 的计算,并在s[i][j]中添入了相应的断点。其中的第(7)句因 的最小计算量以及相应的断点。 = 6000 m[3][4] + p[1]*p[2]*p[4] = 26255×10, 10×20, m[2][3] + p[0]*p[1]*p[3] = =1000 +30*35*5 = 7875 20×25, m[4][5] + p[2]*p[3]*p[5] = 750 +35*15*10 = 2500 为35×35, j]: 子问题A[i: 35×15, 15×5, +5*10*25 部置零,即子问题A[i][i] 0。 应的断点s[i][j],如下图中所示: 15125。由s[1][6] = 3可知A[1: 6]的最优计算次序为A[1: 3] m[5][6] p[3]*p[4]*p[6] 5000 +15*5*20 6250 为j =6];由s[1][3]=1可知A[1: 3]的最优计算次序为A[1: 执行第(7)句计算A[2:3][4:4],=5, m[2][3]+m[4][4]+ 6+ 1] 即p =35, p1=35, p2=15, p3 A[4: 0i+1(k=i+1)而被跳过去了,实际并没有执行。 =25。 执行第(7)句计算A[3:4][5:5], t = m[3][4]+m[5][5]+ 执行第(7)句计算A[4:5][6:6], = m[4][5]+m[6][6]+ 执行第(7)句计算A[1:2][3:3], tt = p4=10, p5m[3][3] m[1][2] + =20, p p[1]*p[3]*p[4] = 2625+0+35*5*10 ==3500<6250,所以 A[2: 3];由s[4][6]=5可知A[4: 6]的最优计算次序为A[4: p[2]*p[4]*p[5] = 750+0+15*10*20 3750>2500,所以 p[3]*p[5]*p[6] 1000+0+5*20*25 18375>7875,所以 p[0]*p[2]*p[3] = 15750+0+35*15*5= 4375<6000,所以 5] m[2][4]改为4375,断点改为3。 1(A2A3))((A4A5)A6)。 A[6: 6];因此最优计算次序为:(A m[3][5]仍为2500,断点仍为3。 m[4][6]改为3500,断点改为5。 m[1][3]不变,断点仍为1。
k=1 n–1
= 1 + (n – 1) +∑(T(k) + T(n–k)) = n +∑T(k) + ∑T(n–k) = n + 2∑T(k)
k=1 k=1 n–1 k=1 n–1 k=1 n–1
n–1
可用数学归纳法证明T(n)≥2n–1 = (2n)。 直接递归算法的时间复杂性随n的指数增长。
算法设计与分析 13
i≤k<j
其中矩阵Ai ,1≤i≤n,的维数为pi–1×pi。 根据此递归式就可以直接用递归程序来实现。
算法设计与分析11ຫໍສະໝຸດ 算法设计与分析12
直接递归的时间复杂性
• 根据前面的递归式不难得出RecurMatrxChain的 时间复杂性为 T(n) ≥ 1 + ∑(T(k) + T(n–k) + 1)
直接递归中有大量重复计算
• 直接递归中有大量重复计算,如A[1: 4]计算中:
1: 4
图中红框标出的 都是重复计算。
3: 4
1: 2 1: 1 2: 4 1:1 2: 3 2: 2 4: 4 3: 3 2: 2
3: 3
4: 4 1: 1 2: 2 2: 3 3: 3
1: 3
4: 4
2: 2 3: 3
算法设计与分析
7
不同计算顺序的差别
• 设矩阵A1, A2和A3分别为10×100, 100×5和 5×50的矩阵,现要计算A1A2A3 。 • 若按((A1A2)A3)来计算,则需要的数乘次数为 10 100 5 10 5 50 10×100×5 + 10×5×50 = 7500 • 若按(A1(A2 A3))来计算,则需要的数乘次数为 100 ×5 ×50+ 10×100×50 = 75000 • 后一种计算顺序的计算量竟是前者的10倍! • 所以,求多个矩阵的连乘积时,计算的结合 顺序是十分重要的。
• 直观的方法是用回溯法搜索。时间复杂 度为指数级。 • 低效的原因:没有充分利用重叠子问题 的性质。
算法设计与分析
3
多阶段图最短路问题(3)
• 此图有明显的次序,可以划分为5阶段。故此问题的要求是:在 各个阶段选取一个恰当的决策,使由这些决策组成的一个决策序 列所决定的一条路线,其总路程最短。 • 由目标状态E向前推,可以分成四个阶段,即四个子问题。每个 阶段到E的最省费用为本阶段的决策路径。
C1 B1 A B2 C3 D3 C4 阶段0 阶段1 阶段2 阶段3 阶段4
4
C2
D1 D2 E
算法设计与分析
多阶段图最短路问题(4)
• 设 Dis[k][x] 为第k阶段城市x到城市E的最短路 径长度。 map[ i ][ j ]为i,j两个城市间的距离。 • 递归方程为 Dis[k][x] = min { Dis[k+1][y]+map[x,y] } • 此问题时间复杂度降为O(n2).
算法设计与分析 15
自底向上的计算
• 例如对于A1A2A3A4,依据递归式以自底向上的 方式计算出各个子问题,其过程如下: 其中 例如: m[1][3] = m[1][1]+m[2][3]+p0p1p3 m[i][j] = mini≤k<j min m[1][3] m[2][4] m[1][2]+m[3][3]+p0p2p3 {m[i][k]+m[k+1][j]+pi–1pkpj}
3: 4 4: 4
1: 2 1: 1
3: 3 2: 2
14
算法设计与分析
消除重复的计算
• 要消除重复计算,可在在计算过程中保存已解 决的子问题的答案。这样,每个子问题只计算 一次,而在后面需要时只要简单查一下,从而 避免重复计算。 • 计算方式可依据递归式自底向上地进行。 • 注意到在此问题中,不同的有序对 (i, j)就对应 不同的子问题,因此不同的子问题个数个数最 多只有Cn2+ n = θ(n2)个。 • 这样便可以得到多项式时间的算法。
动态规划
算法设计与分析 1
多阶段图最短路问题
• 下图表示城市之间的交通路网,线段上的数字 表示费用,单向通行由A->E。求A->E的最省 费用。
8 2 A 5 B1 11 6 3 C2 C3 C4 7 5 3 C1 2 8 4 D1 D2 D3 1 3 E 5
B2 2
算法设计与分析
2
多阶段图最短路问题(2)
算法设计与分析 10
建立递归关系
• 令m[i][j] , 1≤i, j≤n,为计算A[i, j] 的最少数乘 次数,则原问题为m[1][n]。 • 当i = j时,A[i, j]为单一矩阵, m[i][j] = 0; • 当i<j时,利用最优子结构性质有: m[i][j] = min{m[i][k] + m[k+1][j] + pi–1pkpj}
算法设计与分析
17
消除重复的矩阵连乘算法
• • • • • • • • • • • • • • • Void MatrixChain(int p, int n, int **m, int **s) {//将对角线元素赋值为零,即单个矩阵计算量为0 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; //计算A[i, j] = A[i: i] A[i+1: j] (5) m[i][j] = m[i+1][j] + p[i–1]*p[i]*p[j]; 能。此处分开是为 第(5)步与第(7)步 s[i][j] = i; //记下断点i 了给m[i][j]赋初值。 (7) for (int k = i + 1; k < j; k++) { 能否合在一起? int t = m[i][k] + m[k+1][j] + p[i–1]*p[k]*p[j]; //对i<k<j, 逐个计算A[i, j] = A[i: k] A[k+1: j] if (t < m[i][j]) {m[i][j] = t; s[i][j] = k;} //记下较小的m[i][j]及相应的断点k }}}