第3章 动态规划
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态规划法的求解过程
原问题
子问题1
子问题2
……
子问题n
填 表 原问题的解
7
注意到,计算F(n)是以计算它的两个重叠 子问题 F(n-1)和F(n-2)的形式来表达的,所以, 可以设计一张表填入n+1个F(n)的值。 动态规划法求解斐波那契数F(9)的填表过 程:
0 0 1 1 2 1 3 2 4 3 5 5 6 8 7 13 8 21 9 34
25
动态规划算法的基本要素
一、最优子结构
•矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这 种性质称为最优子结构性质。 •在分析问题的最优子结构性质时,所用的方法具有普遍性:首 先假设由问题的最优解导出的子问题的解不是最优的,然后再 设法说明在这个假设下可构造出比原问题最优解更好的解,从 而导致矛盾。 •利用问题的最优子结构性质,以自底向上的方式递归地从子问 题的最优解逐步构造出整个问题的最优解。最优子结构是问题 能用动态规划算法求解的前提。 注意:同一个问题可以有多种方式刻划它的最优子结构,有些 表示方法的求解速度更快(空间占用小,问题的维度低)
由于矩阵乘法满足结合律,所以计算矩阵的连 乘可以有许多不同的计算次序。这种计算次序 可以用加括号的方式来确定。 若一个矩阵连乘积的计算次序完全确定,也就 是说该连乘积已完全加括号,则可以依此次序 反复调用2个矩阵相乘的标准算法计算出矩阵 连乘积
14
• 例: • A1,A2,A3分别维数为10行100列,100行5 列,5行50列。计算不同加括号方式对运算 次数的影响。
28
3.3 最长公共子序列
• 若给定序列X={x1,x2,…,xm},则另一序列 Z={z1,z2,…,zk},是X的子序列是指存在一个严 格递增下标序列{i1,i2,…,ik}使得对于所有 j=1,2,…,k有:zj=xij。 (删除若干元素后留下 的子序列) • 例如,序列Z={B,C,D,B}是序列X={A,B, C,B,D,A,B}的子序列,相应的递增下标 序列为{2,3,5,7}。 • 给定2个序列X和Y,当另一序列Z既是X的子序 列又是Y的子序列时,称Z是序列X和Y的公共子 序列。
24
public static void matrixChain(int [] p, int [][] m, int [][] s) {
int n=p.length-1;
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;
算法复杂度分析:
对于n个矩阵的连乘积,设其不同的计算次序为P(n)。 由于每种加括号方式都可以分解为两个子矩阵的加括号问题: (A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下:
1 n 1 n 1 P ( n) P ( k ) P ( n k ) P ( n) ( 4 n / n 3 / 2 ) n 1 k 1
16
矩阵连乘问题
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘 的,i=1,2 ,…,n-1。(Ai的维数为pi-1×pi).如何确定计算 矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要 的数乘次数最少。
穷举法:列举出所有可能的计算次序,并计算出每一种计算次 序相应需要的数乘次数,从中找出一种数乘次数最少的计算次序。
算法MatrixChain 首先计算出
m[i][i]=0,i=1,2,…n,然后,再根据递归式,按矩阵 链的方式依次计算 M[i][i+1], 0,i=1,2,…n-1,(矩阵长度为2) M[i][i+2], 0,i=1,2,…n-2,(矩阵长度为3) … … 在计算m[i][j] 时,只用到已计算出的m[i][k]和 m[k+1][j].
第3章 动态规划
1
• 动态规划算法概念
• 将待求解问题分解成若干个子问题,先求解子 •
问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,经分解得到的子问题往往 不是互相独立的。 用一个表来记录所有已解决的子问题的答案。
•
2
3.1 算法总体思想
• 动态规划算法与分治法类似,其基本思想
也是将待求解问题分解成若干个子问题
10
设计动态规划基本步骤
• 找出最优解的性质,并刻划其结 构特征。 • 递归地定义最优值。 • 以自底向上的方式计算出最优值。 • 根据计算最优值时得到的信息, 构造最优解。
11
3.2 矩阵连乘问题
给定n个矩阵 与 A 是可乘 的, 矩阵的连乘积
i 1
, 其中
Ai
。考察这n个
12
完全加括号的矩阵连乘积
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++) {
m[2][2] m[3][5] p1 p 2 p5 0 2500 35 15 20 13000 m[2][5] minm[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
= n
Βιβλιοθήκη Baidu
T(n)
T(n/4)
T(n/4)
T(n/4)
T(n/4)
3
算法总体思想
• 但是经分解得到的子问题往往不是互相独立的。不同
子问题的数目常常只有多项式量级。在用分治法求解 时,有些子问题被重复计算了许多次。
T(n)
=
n
n/4
n/4
n/4
n/4
4
T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/
17
矩阵连乘问题
穷举法::随n的增长呈指数增长的。 动态规划 将矩阵连乘积 简记为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]相乘的计算量
9
动态规划法设计算法一般分成三个阶段:
(1)分段:将原问题分解为若干个相互重叠的子 问题; (2)分析:分析问题是否满足最优性原理,找出 动态规划函数的递推式; (3)求解:利用递推式自底向上计算,实现动态 规划过程。 动态规划法利用问题的最优性原理,以自底向上 的方式从子问题的最优解逐步构造出整个问题的 最优解。
27
二、重叠子问题
•递归算法求解问题时,每次产生的子问题并不总是新问题,有 些子问题被反复计算多次。这种性质称为子问题的重叠性质。 •动态规划算法,对每一个子问题只解一次,而后将其解保存在 一个表格中,当再次需要解此子问题时,只是简单地用常数时 间查看一下结果。 (直接采用递归的算法效率为:O(2n)) •通常不同的子问题个数随问题的大小呈多项式增长。因此用动 态规划算法只需要多项式时间,从而获得较高的解题效率。
22
4.根据信息,构造最优解
从S[1][n]记录的信息可知,计算A[1:n]的最优 加括号方式为 (A[1:S[1][n]])(A[S[1][n]+1:n]) 而A[1:S[1][n]])的最优加括号方式为 (A[1:[1]S[1][n]]]) (A[S[1][S[1][n]+1:S[1]S[1]n]]])
21
3.自底向上,计算最优值
对于1≤i≤j≤n不同的有序对(i,j)对应于不同的子问 题。因此,不同子问题的个数最多只有
由此可见,在递归计算时,许多子问题被重复计算多 次。这也是该问题可用动态规划算法求解的又一显著 特征。 用动态规划算法解此问题,可依据其递归式以自底向 上的方式进行计算。在计算过程中,保存已解决的子 问题答案。每个子问题只计算一次,而在后面需要时 只要简单查一下,从而避免大量的重复计算,最终得 到多项式时间的算法
完全加括号的矩阵连乘积
完全加括号的矩阵连乘积可递归地定义为:
(1)单个矩阵是完全加括号的; (2)矩阵连乘积 是完全加括号的,则 可 表示为2个完全加括号的矩阵连乘积 和 的乘积并加括号,即
设有四个矩阵
,它们的维数分别是:
总共有五中完全加括号的方式
16000, 10500, 36000, 87500, 34500
23
例子 用动态规划法求最优解
A1 A2 A3 A4 A5 A6 3035 3515 155 510 1020 2025
1.计算A1, A2,A3,A4,A5,A6 2.计算(A1,A2), (A2,A3), (A3,A4), (A4,A5), (A5,A6) 3.计算(A1, A2,A3),…,(A4,A5,A6) 4.计算(A1, A2,A3,A4), …,(A3,A4,A5,A6) 5.计算(A1, A2,A3,A4,A5),(A2,A3,A4,A5,A6) 6.计算(A1, A2,A3,A4,A5,A6)
F(1)
算法总体思想
• 如果能够保存已解决的子问题的答案,而在需要时再
找出已求得的答案,就可以避免大量重复计算,从而 得到多项式时间算法。
T(n)
n/2
T(n/4) T(n/4) T(n/4)
=
n
n/2 n/2 n/2
T(n/4)
6
T(n/4)
T(n/4) T(n/4) T(n/4)T(n/4)T(n/4) T(n/4)
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)。
29
最长公共子序列 (删除若干元素后留下的子序列)
18
1.分析最优解的结构
• 特征:计算A[i:j]的最优次序所包含的
计算矩阵子链 A[i:k]和A[k+1:j]的 次序也是最优的。 • 矩阵连乘计算次序问题的最优解包含着 其子问题的最优解。这种性质称为最优 子结构性质。问题的最优子结构性质是 该问题可用动态规划算法求解的显著特 征。
19
2.建立递归关系
8
用动态规划法求解的问题具有特征:
能够分解为相互重叠的若干子问题; 满足最优性原理(也称最优子结构性 质):该问题的最优解中也包含着其子问 题的最优解。 (用反证法)分析问题是否满足最优性原理: 1. 先假设由问题的最优解导出的子问题的解 不是最优的; 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时, 这里 的维数为 i<=k<j
可以递归地定义m[i,j]为:
的位置只有
种可能
20
3.自底向上,计算最优值
例:计算斐波那契数:
0 F ( n) 1 F (n 1) F (n 2)
n0 n 1 n2
n=5时分治法计算斐波那契数的过程。
F(5) F(4) F(3) F(2) F(1) F(0)
5
F(3) F(2) F(2) F(0) F(1) F(0) F(1)
F(1)
矩阵A和B是可乘的条件是矩阵A的列数 等于矩阵B的行数。 若A是p×q矩阵,B是一个q×r矩阵,则 其乘积C=AB是一个p×r矩阵。 在计算C的标准算法中,主要计算在三 重循环,总共需要pqr次数乘。
13
矩阵连乘问题
给定n个矩阵 乘的,
, 其中 Ai 与 Ai 1 是可 。考察这n个矩阵的连乘积