- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第3章 动态规划 本章主要内容 矩阵连乘问题 掌握 动态规划算法的基本要素 熟练掌握 流水作业调度 了解 0-1背包问题 熟练掌握 最优二叉搜索树 熟练掌握 动态规划算法 1 n=0 F(n)= 1 n=1 F(n-1)+F(n-2) n1 动态规划算法 将待求解的问题分解成若干个子问题,先求解子问题,并存储子问题的解而避免计算重复的子问题,再由子问题的解得到原问题的解。 动态规划与分治的联系区别 都是分解成子问题,由子问题的解得到原问题的解。 分治中子问题相互独立,而动态规划中子问题互相有联系,且存在重复计算,即存在重叠子问题。 3.1 矩阵连乘问题 矩阵相乘满足结合律,连乘积可以有许多不同的次序。这种次序可以用加括号的方式确定。 考查两个矩阵相乘的情形:C=AB。如果矩阵A,B分别时p×r和r×q 矩阵,则它们的乘积C 将是p×q 矩阵,其(i, j)元素为 则共需要pqr次数乘。 完全加括号的矩阵连乘积 单个矩阵是完全加括号的; 矩阵连乘积A是完全加括号的,则A可表示为2个完全加括号的矩阵连乘积B和C的乘积并加括号,即A=(BC)。 两个矩阵的乘法 void MatrixMultiply(int **a, int **b, int **c, int ra, int ca, int rb, int cb) { if(ca! = rb ) error(“矩阵不可乘”); for(int i = 0; i ra; i ++) for(int j = 0; j cb; j ++){ int sum = a[i][0]* b[0][j]; for(int k = 1; k ca; k ++) sum + = a[i][k]* b[k][j]; c[i][j] = sum; } } 穷举搜索法 对于q个矩阵的连乘积,设有p(n)个计算次序。我们可以在第k个和第k+1个矩阵之间将原矩阵划分为两个子矩阵序列,然后分别对这两个矩阵子序列完全加括号,最后对所得的结果加括号,则 其中P(n)=C(n-1), 1.分析最优解的结构 设A[ i: j ]为矩阵连乘积AiAi+1···Aj 计算A[1: n]的最优次序,设该次序在矩阵Ak和Ak+1之间断开,1≤kn,则完全加括号方式为((A1···Ak) (Ak+1···An)) 总计算量为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 ]所需的最少次数为m[i][j],原问题的最优解为m[1][n]。 当 i = j 时,A[ i : j ]= Ai ,m[ i ][ i ] = 0,i=1,2,···,n。 当 i j 时m[ i ][ j ]=m[ i ][ k ] + m[ k+1 ][ j ] + pi-1pkpj k∈ { i, i+1, ···, j-1 } 采用递归方法计算 int RecurMatrixChain( int i, int, j, int p[]) { if ( ) return 0; int u=RecurMatrixChain(i, i)+RecurMatrixChain(i+1,j,p) +p[i-1]*p[i]*p[j]; s[i][j]=i; for(int k=i+1; kj; k++){ int t=RecurMatrixChain(i,k)+RecurMatrixChain(k+1,j,p) +p[i-1]*p[i]*p[j]; if (tu) { u=t
文档评论(0)