矩阵链乘法(动态规划)

一 题意描述:

给定由n个要相乘的矩阵构成的序列(链)<A1,A2,A3,····An>。由于矩阵满足结合律(加括号方式表示结合方式),不同的计算方式导致的求出最终计算结果的代价相异,有的花的时间很少,有的方式所花时间很多,那么下面的任务就是求出算出结果所需要的最少时间及一个最优解。

二 思路分析:

设p(n)表示一串n个矩阵可能的加全部括号方案数。当n=1时,只有一个矩阵,此时p(1)=1。当n>=2时,一个加全部括号的矩阵乘积等于两个加全部括号的子矩阵乘积的乘积,而且这两个子乘积之间的分裂可能发生在第k个和第k+1个矩阵之间,其中k=1,2,····,n-1;因此可以求得递归式:

1.找局部最优解:把问题: 转化成两个最优子问题:

2.构造递归解:

首先定义m[i,j]为解决子问题A[i....j]的最小计算次数,那么解决整个问题A[1,n]所花的最小时间为m[1,n]。

那么递归方程可以写成如下形式:

为了跟踪如何构造一个最优解我们可以定义s[i,j]为这样的一个k值,在该处分裂乘积后可得一个最优解。

3.构造函数进行求解

输出最优路径的函数自己编写,经过调用数组s[i][j]即可。

矩阵链乘法(动态规划),布布扣,bubuko.com

时间: 2024-12-14 18:09:47

矩阵链乘法(动态规划)的相关文章

动态规划-矩阵链乘法

问题描述: 给定由n个要相乘的矩阵构成的序列(链)<A1,A2,...,An>,要计算乘积A1A2...An,可以将两个矩阵相乘的标准算法作为一个子程序,通过加括号确定计算的顺序(对同一矩阵链,不同的计算顺序所需要的计算次数大不相同). 目标问题:给定n个矩阵构成的矩阵链<A1,A2,...,An>,其中,i=1,2,...,n,矩阵Ai的维数为pi-1×pi,对乘积A1A2...An以一种最小计算次数加全部括号. 穷尽搜索: 令P(n)表示一串n个矩阵可能的加全部方案数.当n=1

[CLRS][CH 15.2] 动态规划之矩阵链乘法

摘要 整理了矩阵链乘法的动态规划思路. 题目 给定n个要相乘的矩阵构成的序列<A1, A2, ... , An>,其中 i=1, 2, ..., n,矩阵 Ai 的维数为pi-1*pi.计算乘积 A1A2...An 的最小代价的矩阵相乘循序. 补充:矩阵乘法满足结合律,例如,乘积 A1A2A3A4 共有五种不同加括号结合形式.不同的结合形式极大的影响运算效率.当且仅当矩阵A和B相容(A.列 = B.行)时,才可以计算矩阵乘法.例如:矩阵A为p*q, 矩阵B为q*r,则相乘后得到的矩阵C为p*r

算法导论--动态规划(矩阵链乘法)

矩阵链乘法问题 给定一个n个矩阵的序列?A1,A2,A3...An?,我们要计算他们的乘积:A1A2A3...An.因为矩阵乘法满足结合律,加括号不会影响结果.可是不同的加括号方法.算法复杂度有非常大的区别: 考虑矩阵链:?A1,A2,A3?.三个矩阵规模分别为10×100.100×5.5×50 假设按((A1A2)A3)方式,须要做10?100?5=5000次,再与A3相乘,又须要10?5?50=2500,共须要7500次运算: 假设按(A1(A2A3))方式计算.共须要100?5?50+10

【算法导论】动态规划之“矩阵链乘法”问题

上一篇里,介绍了动态规划的"钢管切割"问题,这一次来看看"矩阵链乘法".所谓矩阵链乘法就是一个或一个以上的矩阵连续相乘,这里主要关注的是乘法的次数. 一.概述 以两个矩阵相乘为例,A1*A2,A1和A2为两个矩阵,假设A1的行列数是p*q,A2的行列数是q*r.注意这里由于是A1乘以A2,所以A1的列数要等于A2的行数,否则无法做矩阵乘法,满足上述条件的矩阵,我们称之为"相容"的.那么对于A1*A2而言,我们需要分别执行p*r次对应A1的行元素乘

[动态规划] 矩阵链乘法问题

什么是矩阵链乘法(Matrix Chain Multiplication) 矩阵链乘法问题是指给定一串矩阵序列M?M2..Mn,求至少需要进行多少次乘法运算才能求得结果 比如对于这个M?M?M?的矩阵链, 我们可以先计算M?M?然后结果乘以M?,也可以M?M?先算,然后乘以M?,为了表达方便,可以用括号表示计算顺序. 矩阵链M?M?M?有两种计算顺序:((M?M?)M?)和(M?(M?M?)). 那么不同计算顺序有什么区别? 对于((M?M?)M?): 对于(M?(M?M?)):  我们要做的就

动态规划之矩阵链乘法

矩阵链相乘 矩阵链乘法 求解矩阵链相乘问题时动态规划算法的另一个例子.给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积 A1A2...An ?两个矩阵A和B只有相容(compatible),即A的列数等于B的行数时,才能相乘.如果A是p×q的矩阵,B是q×r的矩阵,那么乘积C是p×r的矩阵.计算C所需要时间由第8行的标量乘法的次数决定的,即pqr. ? ?以矩阵链<A1,A2,A3>为例,来说明不同的加括号方式会导致不同的计算代价.假设三个矩阵的

算法13---动态规划矩阵链乘法

算法13---动态规划矩阵链乘法 矩阵链乘法是动态规划里面使用到的一个例子 1 两个矩阵的计算 那么对于一个矩阵的乘法,首先如果是两个矩阵的乘法,那么如何实现呢? 注意到我们使用二维数组表示矩阵,但是二维数组不能作为函数的返回值.具体实现如下 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 5 #define a_rows 3 6 #define a_columns 4 7 #define

Algorithm --&gt; 矩阵链乘法

动态规划--矩阵链乘法 1.矩阵乘法 Note:只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义.一个m×r的矩阵A左乘一个r×n的矩阵B,会得到一个m×n的矩阵C. #include <iostream> using namespace std; #define A_ROWS 3 #define A_COLUMNS 2 #define B_ROWS 2 #define B_COLUMNS 3 void matrix_multiply(int A[A_ROWS][A_COLUMNS],in

矩阵链乘法

对矩阵链加括号的方式会对乘积运算的代价产生巨大影响,现在使用动态规划来对矩阵链乘法问题进行求解. 矩阵链乘法问题可描述如下:给定n个矩阵的链<A1,A2,...,An>,矩阵Ai的规模为pi-1*pi(1 =< i =<n),求完全括号化方案,使得计算乘积A1A2-An所需标量乘法次数最少. 步骤1:最优括号化方案的结构特征 动态规划方法的第一步是寻找最优子结构,然后就可以利用这种子结构从子问题的最优解构造出原问题的最优解.现在给出本问题的最优子结构.假设AiAi+1-Aj的最优括