第3章_动态规划算法.2018.06.前半部分.stu

合集下载

第3章 动态规划PPT课件

第3章 动态规划PPT课件
16
三、备忘录方法
•备忘录方法的控制结构与直接递归方法的控制结构相同,区别
在于备忘录方法为每个解过的子问题建立了备忘录以。
m0
int lookupChain(int i, int j)
{
if (m[i][j] > 0) return m[i][j];
if (i == j) return 0;
用动态规划算法解此问题,可依据其递归式以自底向 上的方式进行计算。在计算过程中,保存已解决的子 问题答案。每个子问题只计算一次,而在后面需要时 只要简单查一下,从而避免大量的重复计算,最终得 到多项式时间的算法
13
用动态规划法求最优解
void matrixChain(int [ ] p, int[][ ] m, int [ ][ ] s)
设有四个矩阵 A,B,C,,它D们的维数分别是:
A5010B1040C4030D305
总共有五中完全加括号的方式
(A((BC)D)) (A(B(CD))) ((AB)(CD)) ((A( B)C)D) ((A(BC))D)
16000, 10500, 36000, 87500, 34500 7
矩阵连乘问题
• 给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的 子序列时,称Z是序列X和Y的公共子序列。
• 给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y 的最长公共子序列。
18
最长公共子序列的结构
设序列X={x1,x2,…,xm}和Y={y1,y2,…,yn}的最长公共子序列为 Z={z1,z2,…,zk} ,则 (1)若xm=yn,则zk=xm=yn,且zk-1是xm-1和yn-1的最长公共子序列。 (2)若xm≠yn且zk≠xm,则Z是xm-1和Y的最长公共子序列。 (3)若xm≠yn且zk≠yn,则Z是X和yn-1的最长公共子序列。

计算机算法设计与分析第三章动态规划

计算机算法设计与分析第三章动态规划
该解决策略在某些情况下可得到最优解,但在很多 情况下得不到最优解。如上例的第(5)种完全加括号 方式即采用该策略,但得到的显然不是最优解。
18
第十八页,共109页。
矩阵维数大的优先计算 在n个矩阵的n+1个维数序列p0 ,p1, p2,…, pn中选择维数的最大值 (设为pi),并把相邻两个含有维数pi的矩阵优先进行计算,然
7
第七页,共109页。
算法总体思想
动态规划的思想实质是分治思想和解决冗余
动态规划算法与分治法类似,其基本思想也是将待求解 问题分解成若干个子问题
T(n)
=n
T(n/2)
T(n/2)
T(n/2)
T(n/2)
8
第八页,共109页。
算法总体思想
但是经分解得到的子问题往往不是互相独立的。不同子问题的数 目常常只有多项式量级。在用分治法求解时,有些子问题被重复 计算了许多次。
15
第十五页,共109页。
16
第十六页,共109页。
穷举法
列举出所有可能的计算次序,并计算出每一种计算次序 相应需要的数乘次数,从中找出一种数乘次数最少的计 算次序。
算法复杂度分析:
对于n个矩阵的连乘积,设其不同的计算次序为P(n)。
由于每种加括号方式都可以分解为两个子矩阵的加括号问题:
(A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下:
for (int r = 2; r <= n; r++) //分别计算r个矩阵连乘的最小数乘次数
for (int i = 1; i <= n - r+1; i++) { int j=i+r-1;

算法之3章动态规划

算法之3章动态规划
求解上面两个子问题,得到的公共子序列谁最长,那谁就是 LCS(X,Y)。用数学表示就是:
LCS=max{LCS(Xn-1,Ym),LCS(Xn,Ym-1)} 由于条件 1) 和 2) 考虑到了所有可能的情况。因此,我们成功地把原问题 转化 成了 三 个规模更小的子问题。
证明: ⑴. X=<x1, …, xm-1, xm>, Y=<y1, …, yn-1, yn>,则 LCSXY = LCSXm-1Yn-1+ <xm=yn>. 设 zk≠xm,则可加 xm=yn 到 Z,得到一个长为 k+1 的 X 与 Y 的公共序列,与 Z 是 X 和 Y 的 LCS 矛盾。于是 zk=xm=yn。 现在证明 Zk-1 是 Xm-1 与 Yn-1 的 LCS。显然 Zk-1 是 Xm-1 与 Yn-1 的公共序列,我们 需要证明 Zk-1 是 LCS。 假设不是,则存在 Xm-1 与 Yn-1 的公共序列 W,W 的长大于 k-1,增加 xm=yn 到 W, 我们得到一个长大于 k 的 X 与 Y 的公共序列,与 Z 是 LCS 矛盾。于是 Zk-1 是 Xm-1 与 Yn-1 的 LCS。 ⑵ X=<x1, …, xm-1, xm>, Y=<y1, …, yn-1, yn>, xm≠yn,zk≠xm,则 LCSXY= LCSXm-1Y 由于 zk≠xm, Z=LCSXY 是 Xm-1 与 Y 的公共子序列。 我们来证 Z 是 Xm-1 与 Y 的 LCS。设 Xm-1 与 Y 有一个公共子序列 W,W 的长大 于 k, 则 W 也是 X 与 Y 的公共子序列,与 Z 是 LCS 矛盾。 ⑶ 证明同⑵ 。 (2)重叠子问题:
设 X=(x1,x2,.....xn) 和 Y={y1,y2,.....ym} 是两个序列,将 X 和 Y 的最长公共子序列记为

第三章动态规划算法1PPT

第三章动态规划算法1PPT
算法设计与分析 2
不同计算顺序的数量
设n个矩阵的连乘积有P(n)个不同的计算顺序。 由此可得出关于 先在第k个和第k+1 P(n) 个矩阵之间将原矩阵序列 的递归式: 分成两个矩阵子序列, k=1,…, n;再分别 1 n= 1 n–1 P(n) = 对两个子序列完全加括号,最后对结果加括 ∑P(k) P(n–k) n>1 k=1 号,便得到原序列的一种完全加括号方式。 解此递归方程可得P(n) = C(n–1),其中 1 2n n/n3/2) C(n) = n+1 = Ω(4 n 所以P(n)随n的增长呈指数增长。因而穷举搜 索法不是有效的算法。
算法设计与分析 4源自立递归关系令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}
3 3
s[i][j]
3 5 4
5
算法设计与分析
11
MatrixChain的时间复杂性
算法MatrixChain的主要计算取决于程序 中对r、i和k的三重循环。循环体内的计 算量为O(1),1≤ r、i、k≤n,三重循环的 总次数为O(n3)。因此该算法时间复杂性 的上界为O(n3),比直接递归算法要有效 得多。算法使用空间显然为O(n2)。 这种算法称为动态规划。

算法设计与分析 8
自底向上的计算

例如对于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]+p p2p3 {m[i][k]+m[k+1][j]+pi0–1p kp j }

动态规划算法

动态规划算法

21(2+19),28(18+10),19(9+10),21(5+16)。
用同样的方法还可以将4阶数塔问题,变为3阶数塔问题。 …… 最后得到的1阶数塔问题,就是整个问题的最优解。
2.存储、求解: 1) 原始信息存储 原始信息有层数和数塔中的数据,层数用一个整型 变量n存储,数塔中的数据用二维数组data,存储成如
29 19 10
21 4
16
数塔及动态规划过程数据
总结
动态规划=贪婪策略+递推(降阶)+存储递推结果 贪婪策略、递推算法都是在“线性”地解决问题,而动态 规划则是全面分阶段地解决问题。可以通俗地说动态规划是 “带决策的多阶段、多方位的递推算法”。
2、算法框架
1.适合动态规划的问题征
动态规划算法的问题及决策应该具有三个性质:最优 化原理、无后向性、子问题重叠性质。 1) 最优化原理(或称为最佳原则、最优子结构)。 2) 无后向性(无后效性)。 3) 有重叠子问题。
2. 动态规划的基本思想
动态规划方法的基本思想是,把求解的问题分成许多阶 段或多个子问题,然后按顺序求解各子问题。最后一个子问 题就是初始问题的解。
由于动态规划的问题有重叠子问题的特点,为了减少重 复计算,对每一个子问题只解一次,将其不同阶段的不同状 态保存在一个二维数组中。
3. 设计动态规划算法的基本步骤
3、动态规划应用
【例1】 背包问题 给定 n种物品和一个容量为 C的背包,物品 i的重 量是 wi ,其价值为 vi ,背包问题是如何选择装入背包 的物品,使得装入背包中物品的总价值最大?
算法分析
前 i 个物品(1≤i≤n)定义的实例: 物品的重量分别为w1,…,wi, 价值分别为v1,…,vi, 背包的承重量为j(1≤j≤W)。 设V[i,j]为该实例的最优解的物品总价值,也就 是说,是能够放进承重量为j的背包中的前i个物品中 最有价值子集的总价值。 可以把前i个物品中能够放进承重量为j的背包中的 子集分成两个类别: 1、包括第i个物品的子集 2、不包括第i个物品的子集

第3章 动态规划

第3章 动态规划
j 1
i 1 2 3 4 5 6
2
3
4
5
6
可以表示为: n=6,p=(30, 35, 15, 5, 10, 20, 25)
2016年1月16日星期六
第3章 动态规划
22
1 2 3 4 5 6 0 15750 7875 9375 11875 15125 0 2625 4375 7125 10500 0 750 2500 5375 0 1000 0 3500 5000 0
8
T(n)
n/2
T(n/4) T(n/4) T(n/4)
=
n
n/2 n/2 n/2
T(n/4)
T(n/4)
T(n/4) T(n/4) T(n/4)T(n/4)T(n/4) T(n/4)
避免大重复计算
2016年1月16日星期六
第3章 动态规划
9
动态规划的实质 动态规划的实质是分治思想和解决冗余。
1) 一种将问题实例分解为更小的、相似的子问题。 2) 存储子问题的解而避免计算重复的子问题。 主要特点: 问题分解;采用表格技术,用多项式 算法代替指数算法;空间换取时间
• 虽然动态规划主要用于求解以时间划分阶段的动 态过程的优化问题,但是一些与时间无关的静态 规划(如线性规划、非线性规划),只要人为地引 进时间因素,把它视为多阶段决策过程,也可以 用动态规划方法方便地求解。 • 应用广泛:经济管理、生产调度、工程技术和最 优控制。例如最短路线、库存管理、资源分配、 设备更新、排序、装载等问题,用动态规划方法 比用其它方法求解更为方便。
第3章 动态规划
23
m[4][4] m[5][6] p3 p4 p6 0 5000 1250 m[4][6] min m[4][5] m[6][6] p3 p5 p6 0 1000 2500 min{6250 ,3500 } 3500

动态规划算法

动态规划算法动态规划是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的⽅式去解决。

[1]动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若⼲个⼦问题(阶段),按顺序求解⼦阶段,前⼀⼦问题的解,为后⼀⼦问题的求解提供了有⽤的信息。

在求解任⼀⼦问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。

依次解决各⼦问题,最后⼀个⼦问题就是初始问题的解。

动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若⼲个⼦问题(阶段),按顺序求解⼦阶段,前⼀⼦问题的解,为后⼀⼦问题的求解提供了有⽤的信息。

在求解任⼀⼦问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。

依次解决各⼦问题,最后⼀个⼦问题就是初始问题的解。

由于动态规划解决的问题多数有重叠⼦问题这个特点,为减少重复计算,对每⼀个⼦问题只解⼀次,将其不同阶段的不同状态保存在⼀个⼆维数组中。

能采⽤动态规划求解的问题的⼀般要具有3个性质:(1)最优化原理:如果问题的最优解所包含的⼦问题的解也是最优的,就称该问题具有最优⼦结构,即满⾜最优化原理。

(2)⽆后效性:即某阶段状态⼀旦确定,就不受这个状态以后决策的影响。

也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。

(3)有重叠⼦问题:即⼦问题之间是不独⽴的,⼀个⼦问题在下⼀阶段决策中可能被多次使⽤到。

(该性质并不是动态规划适⽤的必要条件,但是如果没有这条性质,动态规划算法同其他算法相⽐就不具备优势)动态规划所处理的问题是⼀个多阶段决策问题,⼀般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。

这些决策形成了⼀个决策序列,同时确定了完成整个过程的⼀条活动路线(通常是求最优的活动路线)。

如图所⽰。

动态规划的设计都有着⼀定的模式,⼀般要经历以下⼏个步骤,如下图所⽰:初始状态→│决策1│→│决策2│→…→│决策n│→结束状态(1)划分阶段:按照问题的时间或空间特征,把问题分为若⼲个阶段。

第3章 动态规划(part1)


2
G D
3 4 2 2
L H
4 1 1 1
Q M
5 2 3 4
3 4
T R
A
2
2
O
1
B
3
E
2
I
3
N
问题2:最短路径
• 对有向无环图,求从s到t的一条最短路径
2 9 s
4
1
7
3
1 3 7 4 1 11 51 8
6 2 6 5 2 4 3 7 5 8
9 4 10
11 2 5
12 t
2
6
问题3:背包问题
3、若需求出问题的一个最优解,则必须执行步骤4, 步骤3中记录的信息必须足够多以便构造最优解。
动态规划的求解方法
按自底向上方式求解
– 是动态规划方法的一种 – 所有子问题计算一次,无需递归代价 – 效率较高
程序(next page)
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+ l; 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; 备忘录方法 } } }

动态规划算法

动态规划百科名片动态规划算法通常用于求解具有某种最优性质的问题。

在这类问题中,可能会有许多可行解。

每一个解都对应于一个值,我们希望找到具有最优值的解。

动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。

若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。

如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。

我们可以用一个表来记录所有已解的子问题的答案。

不任何思想方法都有一定的局限性,超出了特定条件,它就失去了作用。

同样,动态规划也并不是万能的。

适用动态规划的问题必须满足最优化原理和无后效性。

在编程中常用解决最长公共子序列问题、矩阵连乘问题、凸多边形最优三角剖分问题、电路布线等问题。

记忆化搜索给你一个数字三角形,形式如下:12345678910找出从第一层到最后一层的一条路,使得所经过的权值之和最小或者最大.无论对与新手还是老手,这都是再熟悉不过的题了,很容易地,我们写出状态转移方程:f(i,j)=a[i,j]+min{f(i+1,j),f(i+1,j+1)}对于动态规划算法解决这个问题,我们根据状态转移方程和状态转移方向,比较容易地写出动态规划的循环表示方法。

但是,当状态和转移非常复杂的时候,也许写出循环式的动态规划就不是那么简单了。

解决方法:我们尝试从正面的思路去分析问题,如上例,不难得出一个非常简单的递归过程:f1=f(i+1,j+1);f2=f(i+1,j);不可控因素在前面的例子中,第一个阶段有一个状态即A,而第二个阶段有两个状态B1和B2,第三个阶段是三个状态C1,C2和C3,而第四个阶段又是一个状态D。

过程的状态通常可以用一个或一组数来描述,称为状态变量。

《动态规划算法》

对于给定的一对索引i和j, 1i<jn, Mi,j可用如 下方法计算:
编辑ppt
7
二项式系数的计算
1
n k
n k
1 1
n k
1
n k
n! k!(n
k )!
由 Stirling 等式,有
if k 0 or k n if 0 k n
n k
n! (( n / 2 )! ) 2
2nn n / en n(n / 2)n / en
2n n
有效计算上式的方法是按行构造帕斯卡三角形
19.08.2021
编辑ppt
20
19.08.2021
编辑ppt
21
算法的改进
在算法lcs和print-LCS中, 可进一步将数组b省 去. 事实上, 数组元素L[i][j]的值仅由L[i-1][j-1], L[i-1][j]和L[i][j-1]这3个数组元素的值所确定. 对于给定的数组元素L[i][j], 可以不借助于数组 b而仅借助于L本身确定L[i][j]的值是由L[i1][j-1], L[i-1][j]和L[i][j-1]中哪一个值所确定的.
对于Fibonacci序列, 一个明显的方法是从f(1)开 始自底向上地计算到f(n), 只需要(n)时间和(1) 空间.
和前面的方法相比, 可以很大程度降低时间复杂 度.
19.08.2021
编辑ppt
9
The longest common subsequence problem最长公共子序列问题
19.08.2021
编辑ppt
8
What is dynamic programming
什么是动态规划?
当子问题发生重叠时, 分治法做了很多不必要的 工作——重复对重叠的子问题进行求解.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档