- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、典型的动态规划举例——矩阵连乘问题
作为经典的动态规划算法举例,矩阵连乘问题很好地展现了动态规划的特点和实用价值。给
定 n 个矩阵{A1,A2,...,An},其中 Ai 与 Ai+1 是可乘的,i=1,2,...n-1 。现在要计算这n 个矩阵的
连乘积。由于矩阵的乘法满足结合律,所以通过加括号可以使得计算矩阵的连乘积有许多不
同的计算次序。然而采用不同的加扩号方式,所需要的总计算量是不一样的。若A 是一个
p*q 矩阵,B 是一个 q*r 矩阵,则其乘积 C=AB 是一个 p*r 矩阵。如果用标准算法计算 C,
总共需要 pqr 次数乘。
现在来看一个例子。A1 ,A2 ,A3 分别是 10*100,100*5 和 5*50 的矩阵。如果按照((A1A2)A3)
来计算,则计算所需的总数乘次数是 10*100*5+10*5*50=7500。如果按照(A1(A2A3))来计算,
则需要的数乘次数是 100*5*50+10*100*50=75000,整整是前者的 10 倍。由此可见,在计算
矩阵连乘积时,不同的加括号方式所导致的不同的计算对计算量有很大的影响。如何确定计
算矩阵连乘积 A1A2 ,...,An 的一个计算次序,使得依此次序计算矩阵连乘积需要的数乘次
数最少便成为一个问题。
对于这个问题,穷举法虽然易于入手,但是经过计算,它所需要的计算次数是 n 的指数函数,
因此在效率上显得过于低下。现在我们按照动态规划的基本步骤来分析解决这个问题,并比
较它与穷举法在时间消耗上的差异。
(1)分析最优解的结构。
现在,将矩阵连乘积 AiAi+1...Aj 简记为 A[i:j] 。对于A[1:n] 的一个最优次序,设这个计算次
序在矩阵 Ak 和 Ak+1 之间将矩阵链断开(1=kn),那么完全加括号的方式为
((A1...Ak)(Ak+1...An)) 。依此次序,我们应该先分别计算A[1:k]和 A[k+1:n] ,然后将计算结
果相乘得到 A[1:n] ,总计算量为A[1:k] 的计算量加上A[k+1:n] 的计算量,再加上A[1:k]和
A[k+1:n]相乘的计算量。
通过反证法可以证明,问题的关键特征在于,计算 A[1:n] 的一个最优次序所包含的计算矩阵
子链 A[1:k]和 A[k+1:n] 的次序也是最优的。因此,矩阵连乘积计算次序问题的最优解包含着
其子问题的最优解。这种最优子结构性质是该问题可以用动态规划解决的重要特征。
(2 )建立递归关系定义最优值。
设计算 A[i:j](1=i=j=n)所需的最少数乘次数为 m[i][j] ,则原问题的最优值为m[1][n] 。而
且易见,当 i=j 时,m[i][j]=0 。
根据上述最优子结构性质,当 ij 时,若计算A[i:j] 的最优次序在Ak 和 Ak+1 之间断开,可
以定义m[i][j]=m[i][k]+m[k+1][j]+pi-1*pk*pj(其中,Ai 的维数为pi-1*pi) 。从而有:
当 i=j 时,m[i][j]=0。
当 ij 时,m[i][j]=min{m[i][k]+m[k+1][j]+pi-1*pk*pj} (i=kj)。
第 1 页 共 11 页
除此之外,若将对应于m[i][j] 的断开位置记为 s[i][j],在计算出最优值m[i][j]后,可以递归
地由 s[i][j]构造出相应的最优解。
(3 )计算最优值。
如果直接套用 m[i][j] 的计算公式,进行简单的递归计算需要耗费指数计算时间。然而,实际
上不同的子问题的个数只是 n 的平方项级(对于 1=i=j=n 不同的有序对(i,j)对应于不同的
子问题) 。用动态规划解决此问题,可依据其递归式以自底向上的方式进行计算。在计算过
程中,保存已解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,
从而避免大量的重复计算,最终得到多项式时间的算法。下面给出计算 m[i][j] 的动态规划算
法:
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]
您可能关注的文档
最近下载
- UbuntuLinux操作系统第2版(微课版)钟小平课后习题答案.doc VIP
- 输电线路三跨的经验分享.ppt VIP
- 电动汽车分布式驱动系统动力学分析与优化设计.docx VIP
- 专题1.4数轴与动点经典题型(四大题型)(原卷版+解析).docx VIP
- 幼儿小蝌蚪找妈妈绘本ppt课件.pptx VIP
- 磷酸铁行业现状.docx VIP
- 马克思主义与社会科学方法论课后习题答案(2018版).pdf VIP
- 6.1 树立法治观念 统编版道德与法治八年级上.pptx VIP
- GB_T 43933-2024 金属矿土地复垦与生态修复技术规范.pdf VIP
- 车牌识别系统软件使用说明8.1软件基本设置.pdf VIP
原创力文档


文档评论(0)