一、问题描述

  矩阵乘法规则

  如果A是a*b的矩阵,B是b*c的矩阵,那么AB就是a*c的矩阵,所做的乘法次数为a*b*c

  矩阵链乘法

  给定一个矩阵链A1A2A3A4要计算乘积,给这个矩阵链加上括号,来改变运算次序。

  如果矩阵链为(A1,A2,A3,A4),那么有如下5中加括号的方式:

  (A1(A2(A3A4)))

  (A1((A2A3)A4))

  ((A1A2)(A3A4))

  ((A1(A2A3))A4

  (((A1A2)A3)A4

  而改变矩阵的运算次序,能改变所做乘法的运算次数,比如说3个矩阵的链(A1,A2,A3),假设3个矩阵的维数分别为10*100,100*5,5*50。按照((A1,A2)A3)的次序来计算,需要10*100*5+10*5*50=7500次乘法。但如果按照(A1(A2,A3))的次序来计算,则需要100*5*50+10*100*50=75000次乘法,慢了10倍。

  总而言之,矩阵链中不同的运算顺序会导致运算次数有很大的差异

  矩阵链乘法问题

  矩阵链乘法问题就是寻找一个最佳的运算次序,使所做的乘法次数最小

  p[n+1]:表示n个矩阵的维度,其中矩阵Ai的维度为pi-1*pi

二、问题分析

  由前面可知,一个序列如果只有一个矩阵,则只有一种方式加全部括号,如果有两个或两个以上的矩阵,则必然可以看做两个子序列的乘积,且这两个子序列又可以分解成更小的两个子序列的乘积(两个矩阵相乘的运算次数看前面)。我们用cost(i,j)表示序列AiAj在最优加全部括号时的标量乘积次数,则

其中pi-1pkpj为子序列AiAkAk+1Aj相乘时的标量相乘次数。

三、代码实现

  代码中,测试用例为6个矩阵相乘,各个矩阵的维度存放在p中

int main()
{//代表矩阵链int p[7] = {30,35,15,5,10,20,25};//mij表示矩阵i到矩阵j的最小代价int m[7][7] = {0};//sij表示矩阵i到矩阵j最小代价的分割点int s[7][7];//长度为1的矩阵代价设为0for (int i = 1; i <= 6; i++)m[i][i] = 0;//对于每一个大于1的长度for (int j = 2; j <= 6; j++)//k为左端点位置,取值不能大于6-k+1,这是计算位置的方式,要记得,for (int k = 1; k <= 6 - j + 1; k++) {int end = k + j - 1;//end为右端点位置m[k][end] = 999999;              //计算代价,图个代价等于划分位置两边的矩阵代价,加上两矩阵合并代价for (int n = k; n <= end; n++) {int temp = m[k][n] + m[n + 1][end] + p[k-1] * p[n] * p[end];if (temp < m[k][end]) {m[k][end] = temp;s[k][end] = n;}}}cout << m[1][6] << endl;system("pause");return 0;
}

  最终输出结果为15125,表示最优运算次数。

转载于:https://www.cnblogs.com/likaiming/p/8053094.html

动态规划--矩阵链乘法相关推荐

  1. 【动态规划】矩阵链乘法

    矩阵链乘法    求解矩阵链相乘问题时动态规划算法的另一个例子.给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积  A1A2...An    为了计算表 ...

  2. 【算法分析与设计】矩阵链乘法最优顺序问题

    矩阵链乘法 矩阵连乘,选择不同的乘法顺序,效率可能千差万别. 高效的实现算法应该用动态规划来设计,具体的讲解可以看这里. 编程实现 public class Main {private static ...

  3. 矩阵链乘法问题 (算法)

    一.概述 以两个矩阵相乘为例,A1*A2,A1和A2为两个矩阵,假设A1的行列数是p*q,A2的行列数是q*r.注意这里由于是A1乘以A2,所以A1的列数要等于A2的行数,否则无法做矩阵乘法,满足上述 ...

  4. python矩阵乘法算法_Python算法|矩阵链乘法

    概述 矩阵乘法是一个满足结合律的运算.显然,对于矩阵A.B.C来说,(AB)C 与 A(BC) 是等价的,我们可以根据自己的心情选择任意的运算顺序,总之,结果都是一样的. 糟糕的是,对计算机来说可不是 ...

  5. C++matrix chain multiplication矩阵链乘法算法的实现(附完整源码)

    C++lmatrix chain multiplication矩阵链乘法算法的实现 C++matrix chain multiplication矩阵链乘法算法的实现的完整源码(定义,实现,main函数 ...

  6. 矩阵链乘法 自顶向下 自底向上 Python 实现 算法导论

    算法导论 矩阵链乘法 自顶向下 自底向上 Python 实现 带备忘的自顶向下实现方式 def Memoized_Matrix_chain(p):n = len(p)m = [[0 for i in ...

  7. 动态规划典型题之——矩阵链乘法

    动态规划是算法分析与设计中一种重要的算法.其核心思想是将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法. 文章目录 一.矩阵链相乘问题 二.求解 1.构建备忘录 2.回溯 结果展示 一.矩 ...

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

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

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

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

  10. 15.2 矩阵链乘法

    1.代码 public class MatrixChainMultiplication {public static void main(String[] args) { // 在该代码中,我们首先创 ...

最新文章

  1. java8 时间加一秒_年货买瓜子有讲究!这些加了“料”的瓜子不安全!
  2. shell 获取ora报错信息_频发:故障排除之又见 ORA-4031丨云和恩墨技术通讯
  3. android百度地图开发之自动定位所在位置与固定位置进行驾车,步行,公交路线搜索...
  4. 点击桌面计算机图打不开,idf,手把手教你怎么解决电脑桌面图标打不开
  5. 【深度学习】2021年深度学习哪些方向比较新颖,处于上升期或者朝阳阶段,没那么饱和,比较有研究潜力?...
  6. Spark 1.3 新特性 :176个贡献者,1000+ patches
  7. 现代操作系统第三版高清.pdf中文版免费下载
  8. 电子表格控件Spreadsheet 对象方法事件详细介绍
  9. C++控制台打飞机小游戏 | CSDN 博文精选
  10. RAID简单介绍和Linux如何搭建一个RAID
  11. Java从零开始(4)——入门项目
  12. Spark 调优 ——cache(persist)与 checkpoint
  13. SPSS25安装教程
  14. Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件(学习笔记)
  15. 稳定性和高可用如何保障?一手测评华为云网站高可用解决方案
  16. 电脑软件没运行,内存爆满可以这样解决
  17. 拿到软考高级证书就是高级职称了吗?
  18. Windows 10系统下查看硬盘类型的方法
  19. google gms包各apk的包名和类名
  20. CornerStone —— 医学影像显示的JavaScript库简介

热门文章

  1. 2021-08-02 INSERT INTO插入语句
  2. linux进程状态a,Linux进程状态标识符含义
  3. fastreport按条件查询_数据分析sql从入门到精通--条件和过滤查询
  4. truffle version/usr/local/lib/node_modules/truffle/build/385.bundled.js:65232 catch cli.bundled.js:6
  5. 基于SSM的作业管理(在线学习)系统
  6. Games101 Tansformer
  7. JVM常量池和八种基本数据及字符串
  8. 一、Oracle学习笔记:认识数据库
  9. 情人节到了,Postman 都脱单了,那你咧?
  10. Netty 网络框架概述 与 快速入门