第3章 动态规划(1-例子)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

总共有五种完全加括号的方式
( A(( BC ) D )) ((( AB )C ) D )
( A( B (CD ))) (( A( BC )) D )
Baidu Nhomakorabea
(( AB )(CD ))
16000, 10500, 36000, 87500, 34500
1
完全加括号的矩阵连乘积

再看一例子:
A1:10×100, A2:100×5, A3:5×50
k 的位置只有 j i 种可能
10
计算最优值

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


由此可见,在递归计算时,许多子问题被重复计算多 次。这也是该问题可用动态规划算法求解的又一显著 特征。 用动态规划算法解此问题,可依据其递归式以自底向 上的方式进行计算。在计算过程中,保存已解决的子 问题答案。每个子问题只计算一次,而在后面需要时 只要简单查一下,从而避免大量的重复计算,最终得 到多项式时间的算法。
矩阵连乘问题
小课堂
什么样的计数值是Catalan数,如下例子: 有n+1个矩阵连乘的加括弧的方式数 有n+1个叶节点的二叉树共有多少种形状?例如4个叶节点:
将一个凸n边形区域分成三角形区域的方法数? 例如6边形分 割:
6
矩阵连乘问题
小课堂
在n*n的方格地图中,从一个角到另外一个角,不跨越对角线 的路径数,例如4×4地图中的路径有:
S[2,5]=3
20
用动态规划法求最优解 ---- s数组的作用
算法MatrixChain只计算出了最优值,但未给出最优 解。也就是说,通过算法MatrixChain的计算,只知道 了用多少次数乘次数是最少的,但还不知道具体应该按 照什么次序做矩阵的乘法才能达到最少数乘次数。 算法MatrixChain过程中已经记录了构造最优解所需 的全部信息。即S[i][j]中记录的值k表明矩阵链A[i:j] 的最佳方式(即最优解)为(A[i:k])(A[k+1:j])。
A1 3035 A2 3515 A3 155 A4 A5 A6 510 1020 2025

最优计算次序为:(A1(A2A3))((A4A5)A6) 若:A1A2A3的最优次序是:A1(A2A3) 或若A4A5A6的最优次序是:(A4A5)A6
9
建立递归关系

设计算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时,
19
用动态规划法求最优解 ---- 实例、填充方法
例:P= <30, 35, 15, 5, 10, 20, 25>
A1 3035 A2 3515 A3 155 A4 510 A5 A6 1020 2025
最终结果: m[1,6] =15125 S[1,6] = 3 (A1A2A3)(A4A5A6) S[1,3] = 1 (A1)(A2A3) S[4,6] = 5 (A4A5)(A6)
11
n 2 n ( n ) 2
计算最优值
在递归计算时,许多子问题被重复计算多次
12
方法一:递归算法求解
13
递归算法复杂性
看出:递归算法的计算时间随着n指数增长为下 界,即(2n)。
14
递归算法复杂性
15
方法二:用动态规划法求最优解 ---- 算法
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;} } } }
1 n 1 n1 P(n) P(k)P(nk) P(n) (4n / n3/ 2) n 1 k1
4
矩阵连乘问题
小课堂
对于n个矩阵连乘积的不同计算次序数P(n),P(n)是 Catalan数。 Catalan数很神奇,常出现在组合数学中各种计数 问题。 其n阶递推关系: h(0)=1,h(1)=1,h(n)=h(0)*h(n-1) + h(1)*h(n2) + ... + h(n-1)h(0) (其中n>=2) 递推关系解的一般公式:C(2n,n)/(n+1) 前几项:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, …… 5
18
用动态规划法求最优解 ---- 实例、填充方法
例:P= <30, 35, 15, 5, 10, 20, 25>
A1 3035 A2 3515 A3 155 A4 510 A5 A6 1020 2025
m[2][2] m[3][5] p1 p 2 p5 0 2500 35 15 20 13000 m[2][5] min m[2][3] m[4][5] p1 p3 p5 2625 1000 35 5 20 7125 m[2][4] m[5][5] p p p 4375 0 35 10 20 11375 1 4 5
16
方法二:用动态规划法求最优解 ---- 算法
算法复杂度分析: 算法matrixChain的主要计算量取决于算 法中对r,i和k的3重循环。循环体内的计 算量为O(1),而3重循环的总次数为 O(n3)。 因此算法的计算时间上界为O(n3)。算法所 占用的空间显然为O(n2)。
17
用动态规划法求最优解 ---- 子问题计算顺序
简言之:为了确定加括号的次序,设计一个表s[i, j] 来记录求 得最优时最后一次运算的位置。
21
用动态规划法求最优解 ---- s数组的作用
因此,从s[1][n]记录的信息可知计算A[1:n]的最优加 括号方式为:(A[1 : s[1][n]])(A[s[1][n]+1 : n]) 如:根据s[i][j]的记录,可以计算A[1:6]的最优加括号 方式: (A1A2A3)(A4A5A6) s[1][n]=3 (A1(A2A3))((A4A5)A6) s[1][3]=1, s[4][6]=5 (A1(A2A3))((A4A5)A6) s[2][3]=2, s[4][5]=4
完全加括号的矩阵连乘积

完全加括号的矩阵连乘积可递归地定义为:
(1)单个矩阵是完全加括号的; (2)矩阵连乘积 A 是完全加括号的,则 A 可 表示为2个完全加括号的矩阵连乘积 B 和 C 的乘积并加括号,即 A ( BC )

设有四个矩阵 A, B, C , D ,它们的维数分别是:
A 50 10 B 10 40 C 40 30 D 30 5
22
两种算法的比较
23
相似问题的扩展
思考:
(1)一行的石子合并 有n堆石子形成一行(a1,a2,…,an,ai为第i堆石子个 数),相邻两堆可合并,合并的分值为新堆的石子数。 求合并为一堆的最低得分(或最高得分也同理)。 (2)一圈的石子合并 和前述思考题(1)类似,但n堆石子是围成一圈,求合 并为一堆的最低得分(或最高得分)。
m[i , j ] m[i , k ] m[k 1, j ] pi 1 pk p j

可以递归地定义m[i,j]为:
这里 Ai 的维数为 pi 1 pi
0 i j m[i, j ] min{m[i, k ] m[k 1, j ] pi 1 pk p j } i j i k j
思考:
(2)一圈的石子合并
原问题所求的最小得分是m[1,n], m[2,n+1], …, m[n,2n-1]中的最小值,即:min{m[i, n i 1]}
1 i n
27
动态规划算法的基本要素
一、最优子结构
24
相似问题的扩展
思考:
(1)一行的石子合并 假设m[i,j]为合并石子Ai…Aj, 1≤i≤j≤n,所 得到的最小得分,若没有“合并”这个动作,则为 0。原问题所求的最优值即为m[1,n]。
i j 0 j m[i, j] min{m[i, k ] m[k 1, j ]} a[t ] i j t i ik j
进栈序列为1,2,3,..n(栈无穷大)有多少种不同的出栈序列? 在圆上选择2n个人,两两握手,但无交叉的方案数。 n对括号(左括号和右括号)有多少种匹配方式? 在《Enumerative Combinatorics》一书中,竟然提到了多达 66种组合问题和卡特兰数有关。
7
矩阵连乘问题
穷举法 动态规划 将矩阵连乘积 Ai Ai 1... A j 简记为A[i:j] ,这里i≤j 考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵 Ak和Ak+1之间将矩阵链断开,i≤k<j,则其相应完全 加括号方式为 ( Ai Ai 1... Ak )( Ak 1 Ak 2 ... A j ) 计算量:A[i:k]的计算量加上A[k+1:j]的计算量,再加上 A[i:k]和A[k+1:j]相乘的计算量。
乘法次序 (A1A2)A3: 10 × 100 × 5 + 10 ×5 × 50 = 7500 A1(A2A3): 10 × 100 × 50 + 100 × 5 × 50 = 75000
2
矩阵连乘问题

给定n个矩阵 { A1 , A2 ,..., An } , 其中Ai 与 Ai 1 是可乘 的, i 1,2,..., n 1 。考察这n个矩阵的连乘积
填充m[i,j]即可得到任意行状摆放的石子合并的最 小得分。 25
相似问题的扩展
思考:
(2)一圈的石子合并 先将圆圈排列的石头直线化:
在这个直线化的行状排列的石头堆中进行合并,并 且合并的石头链长不超过n。 假设m[i,j]为合并石子Ai…Aj, 1≤i≤j≤2n-1,所 得到的最小得分。
26
相似问题的扩展
A1 A2 ... An


由于矩阵乘法满足结合律,所以计算矩阵的连乘可以 有许多不同的计算次序。这种计算次序可以用加括号 的方式来确定。 若一个矩阵连乘积的计算次序完全确定,也就是说该 连乘积已完全加括号,则可以依此次序反复调用2个矩 阵相乘的标准算法计算出矩阵连乘积。
3
矩阵连乘问题
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的, i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得 依此次序计算矩阵连乘积需要的数乘次数最少。 穷举法:列举出所有可能的计算次序,并计算出每一种计 算次序相应需要的数乘次数,从中找出一种数乘次数最少的 计算次序。 算法复杂度分析: 对于n个矩阵的连乘积,设其不同的计算次序为P(n)。 由于每种加括号方式都可以分解为两个子矩阵的加括号问题: (A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下:
8
分析最优解的结构

假设A[ i : k ]不是最优,可用最优的 替换原来计算次序,得到A[ i : j ]更 好的次序。矛盾
特征:计算A[i:j]的最优次序所包含的计算矩阵子 链 A[i:k]和A[k+1:j]的次序也是最优的。 矩阵连乘计算次序问题的最优解包含着其子问题 的最优解。这种性质称为最优子结构性质。问题 的最优子结构性质是该问题可用动态规划算法求 解的显著特征。
相关文档
最新文档