给定n个矩阵,其中与 是可乘的,   。考察这n个矩阵的连乘积  由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。

若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积

算法复杂度分析:

对于n个矩阵的连乘积,设其不同的计算次序为P(n)

由于每种加括号方式都可以分解为两个子矩阵的加括号问题: (A1... Ak )(Ak+1…An) 可以得到关于 P(n) 的递推式如下

将矩阵连乘积

将矩阵连乘积简记为A[i:j],这里ij

考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵

AkAk+1之间将矩阵链断开,i≤k<j,则其相应完全

加括号方式为

计算量:A[i:k]的计算量加上A[k+1:j]的计算量,再加上

A[i:k]A[k+1:j]相乘的计算量

特征:计算A[i:j]的最优次序所包含的计算矩阵子链A[i:k]A[k+1:j]的次序也是最优的。

矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。

设计算A[i:j]1≤i≤j≤n,所需要的最少数乘次数m[i,j],则原问题的最优值为m[1,n]

i=j时,A[i:j]=Ai,因此,m[i,i]=0i=1,2,…,n

i<j时,

这里的维数为 

可以递归地定义m[i,j]

k的位置只有j-i可能

在递归计算时,许多子问题被重复计算多次。这也是该问题可用动态规划算法求解的又一显著特征。

用动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算。在计算过程中,保存已解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法

<pre name="code" class="cpp">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;}}}
}

算法复杂度分析:

算法matrixChain的主要计算量取决于算法中对rik3重循环。循环体内的计算量为O(1),而3重循环的总次数为O(n3)。因此算法的计算时间上界为O(n3)。算法所占用的空间显然为O(n2)

矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。
在分析问题的最优子结构性质时,所用的方法具有普遍性:首先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。
利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。
递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质。
动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。

通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率

动态规划-矩阵连乘问题相关推荐

  1. 动态规划矩阵连乘问题

    动态规划基本思想和学习目的 动态规划算法与分治法类似,其基本思想也就是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解,简单概括为自顶向下分解,自底向上求解.动态规划 ...

  2. 蓝桥杯 - 垒骰子(动态规划+矩阵快速幂优化)

    垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...

  3. 算法设计与分析——动态规划——矩阵连乘问题

    动态规划与分治法的异同: 相同点:其基本思想都是将待求解问题分解为若干子问题,先求解子问题,再结合这些子问题的解得到原问题的解. 差异点:与分治法不同的是,适合用动态规划法求解的问题经分解得到的子问题 ...

  4. 动态规划——矩阵中的最短路径长度

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 题目 假设我们有一个 n 乘以 n 的矩阵 w[n][n].矩阵存储的都是正整数.棋子起始位置在左上角, ...

  5. 动态规划——矩阵连乘(算法设计课题)

    问题描述:给定n个矩阵{A1,A2,-,An},其中Ai与Ai+1是可乘的,i=1,2 ,-,n-1.如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少.例如:A1={30 ...

  6. Java动态规划---矩阵链相乘的最小计算代价

    参考书籍:算法导论第三版. 采用自底向上的递归模式来求解. * 动态规划在矩阵链相乘的应用,目的求出最小的计算代价,即矩阵的计算顺序,用加小括号表示. * 主要的计算思想是递归,而且是带备忘录的递归, ...

  7. 矩阵连乘问题算法思想_动态规划-矩阵连乘问题(一)

    动态规划的理论性和实践性都比较强,一方面需要理解状态.状态转移.最优子结构.重叠子问题等概念,另一方面又需要根据题目的条件灵活设计算法. 动态规划是一种用途很广的问题求解方法.它本身并不是一个特定的算 ...

  8. 动态规划——矩阵链相乘

    如果看过我上一篇文章(动态规划--最长公共子序列)的同学,相信已经对动态规划的思想有了一定的了解和认识,即把之前求解得出的子问题存储起来,以便后续求解大问题直接使用. 本章要讲解的问题是矩阵链相乘.因 ...

  9. 动态规划——矩阵连乘问题算法及实现详解(附完整代码)

    问题分析 矩阵连乘问题是经典的动态规划问题,其主要是n个矩阵进行矩阵乘法运算时,通过括号改变运算的先后顺序,减少运算次数,找到最佳划分方法,求解最少运算次数. 算法分析 矩阵连乘问题中动态规划可以帮助 ...

最新文章

  1. 千兆宽带:是为了速度而提升速度吗?
  2. Mybatis的prefix和suffix使用
  3. 为敏感信息设置安全屏障
  4. Android开发之关于transformDexArchiveWithExternalLibsDexMergerForDebug java.lang.OutOfMemoryError问题的参考解决方案
  5. Fast-SCNN:多分支结构共享低级特征的语义分割网络
  6. Opencv+Python:drawContours函数
  7. 搭建Cent OS7服务器时需要注意的一些问题
  8. 国内开源落后?那是不是要做点什么。
  9. c语言各定义长度,关于C语言各个数据类型长度
  10. html+css实现漂亮的透明登录页面,HTML实现炫酷登录页面
  11. Python 自定义模块
  12. 选择背光需要对比哪些因素呢?
  13. CStdioFile 追加文件内容
  14. java实现微信企业付款到个人账户
  15. Unity鼠标滚轴缩放大小
  16. 3D游戏引擎系列十二
  17. 永中Office与Ubuntu 11.04桌面的集成
  18. 基于pdfium获取pdf目录
  19. 交流/备用电池供电切换电路
  20. 巴士拉银匠哈桑的故事(四)

热门文章

  1. 海德薇格:我很期待看到 数字货币将如何改变人民币支付市场
  2. SAP License:年度结算的步骤
  3. 风控模型中的五大类聚类算法介绍
  4. 城市能源管理系统、实时监测、运行监测、负荷效应、预警管理、设备管理、设备入库、设备安装、设备检修、设备报废、设备查询、控制策略、系统集成、HTML/CSS/Bootstrap/jQuery/JS
  5. Axure经典实例高保真交互下载(微信元件高保真交互库+微信原型交互+安卓设备模板含登录注册引导欢迎流程+ios苹果设备模板)
  6. 在Windows平台下实现《简明 Python 教程》第十章案例(利用winrar实现压缩备份)...
  7. 软件工程学习进度第六周暨暑期学习进度之第六周汇总
  8. Java SE 6 中实现 Cookie 功能
  9. Linux centosVMware xshell使用xftp传输文件、使用pure-ftpd搭建ftp服务
  10. vue - (引入jq)