问题描述:给定n个矩阵(A1,A2,A3.....An},其中Ai与Ai+1是可乘的,i=1,2,...n-1。考察n个矩阵的连乘积A1A2A3,....An。由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序,这种计算次序可以用加括号的方式来确定。加括号的方式决定了整个计算量(指的是乘法调用的次数)。所以自然会提出矩阵连乘积的最优计算次序问题。

自然,首先想到的是用枚举法,算出每一种加括号情况下的计算量,取最小的情况。工程之庞大可想而知。溯其源,会发现,"枚举“的这种想法是不可避免的,只有所有情况都考虑比较后,才会出现那个最小量乘的结果。普通的枚举导致庞大工程的一个重要因素就是”子问题重复计算“。这里先要明确,什么是矩阵连乘的子问题。

以A1A2A3A4为例,它的子问题为:A1    A2    A3    A4     A1A2    A2A3     A3A4  A1A2A3   A2A3A4   A1A2A3A4 。你要求A1A2A3A4的最优次序,势必要先求段长为3的子问题的最优次序,而段长为3的子问题是基于段长为2的子问题的基础之上的(这就是一种自底向上的递归)。以此推下去,你很容易会发现两个有意思的现象:第一,假如你已计算出段长为3的子问题的最优次序,那该最优次序下的子问题也是最优的(你可以通过反证法获知);第二,计算完段长为2的子问题,再计算段长为3的子问题时,你还会用到段长为2的子问题的计算结果,那何不把先前的计算结果进行保存,避免重复计算。

以下就是动态规划算法解决矩阵连乘问题的相关代码,思想无非就两点:

第一,自底向上的递归式:

需要指出的是:m[i][j]表示Ai.....Aj的最少数乘次数,k表示求解Ai....Aj的子问题最优值时的断开位置,Pi-1PkPj表示AiAi+1.....Ak和Ak+1....Aj相乘时数乘数。

第二,在计算过程中,保存已解决的子问题答案。

#include

using namespace std;

void outPut(int i,int j,int **s)

{

if(i==j)

return;

outPut(i,s[i][j],s);

outPut(s[i][j]+1,j,s);

cout<

cout<

}

void MartrixChain(int n,int *p,int **m,int **s)

{

for(int t=0;t

{

m[t][t]=0; //单一矩阵的情况 一个矩阵数乘次数为0

s[t][t]=-1;

}

for(int l=2;l<=n;l++) //l为段长

{

for(int i=0;i<=n-l;i++)

{

int j=i+l-1; //j为每段的起点

m[i][j]=m[i][i]+m[i+1][j]+p[i]*p[i+1]*p[j+1]; //类似于赋初值的功能,其可取i<=k

s[i][j]=i;

for(int k=i+1;k

{

if(m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1]

{

m[i][j]=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1];

s[i][j]=k; //记录断点位置

}

}

}

}

cout<

outPut(0,n-1,s);

}

int main()

{

int num;

int *dimension;

int **mm;

int **ss;

cin>>num;

dimension=new int[num+1]; //矩阵维数

mm=new int*[num];

ss=new int*[num];

for(int i=0;i

{

mm[i]=new int[num];

ss[i]=new int[num];

}

for(int r=0;r<=num;r++)

cin>>dimension[r];

MartrixChain(num,dimension,mm,ss);

}

程序实现并不难,但是还是要交代几点容易犯错的细节:

1.表示矩阵维数的数组大小:应该是矩阵个数+1,理由......呵呵;

2.若Ai表示连乘矩阵中第i个矩阵,请你时刻记住,实际上的数组下标是从0开始的;(程序中,我是令i从0开始的)

这两点都可以通过调试修正,只是如果一开始就能想明白,没必要花这种时间。

运行结果如下:

我来解释下运行结果  A  1 , 1  and  A  2 , 2     表示(A1A2)是一个分块的  依次为(A1A2)    (A0(A1A2))    (A3A4)    ((A3A4)A5)    (A0A1A2)(A3A4A5)   综合考虑后,最后加括号的方式为:(( A0 ( A1 A2 ) ) ( ( A3 A4 ) A5 ) )   。

最后,来总结下动态规划算法的要素:1.最优子结构的性质     2.重叠子问题性质

(在此不再赘述,从问题分析中已经体现)。

特别想交代下的是,我在问题分析中提到”枚举“一词,个人觉得动态规划就是”变相的枚举“,只是它通过小规模的一步步枚举在缩小范围,进而减少重复枚举,能达到这个目的就是基于上述的两个要素,而动态规划能得到正确的答案,则是因为它已经考虑比较了所有可能的情况(这也是解决任何问题所不能避免的,只是有些是隐式比较而已)。

还有一个非常欠缺的地方:怎么样直接输出加括号的表达式呢?如(( A0 ( A1 A2 ) ) ( ( A3 A4 ) A5 ) )   。如果无视空间的代价,多开几个数组,用上队列的思想,是可以实现,能不能有更简洁的方法呢?~~~communicating!!!!!!!!

矩阵连乘问题算法思想_动态规划之矩阵连乘问题相关推荐

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

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

  2. Algorithms_算法思想_递归分治

    文章目录 引导案例 递归的定义 什么样的问题可以用递归算法来解决 递归如何实现以及包含的算法思 递归的公式 斐波那契数列代码实现 递归的时间复杂度和空间复杂度 递 与 归 递归的优化 优化方式一:不使 ...

  3. python连乘函数_动态规划之矩阵连乘问题Python实现方法

    本文实例讲述了动态规划之矩阵连乘问题Python实现方法.分享给大家供大家参考,具体如下: 给定n个矩阵{A1,A2,-,An},其中Ai与Ai+1是可乘的,i=1,2 ,-,n-1.如何确定计算矩阵 ...

  4. 矩阵连乘问题算法思想_AI自然语言处理算法岗常见面试题(一)

    从隐藏层到输出的Softmax层的计算有哪些方法? 层次softmax 负采样 层次softmax流程? 构造Huffman Tree 最大化对数似然函数输入层:是上下文的词语的词向量投影层:对其求和 ...

  5. 【数据结构与算法】【算法思想】动态规划

    贪心算法 回溯算法 分治算法 动态规划 贪心:一条路走到黑,就一次机会,只能哪边看着顺眼走哪边 回溯:一条路走到黑,无数次重来的机会,还怕我走不出来 (Snapshot View) 动态规划:拥有上帝 ...

  6. BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 ...

  7. 刷题学习—算法思想(动态规划下)

    24.买卖股票的最佳时机系列 24.1买卖股票的最佳时机 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票.设计一个算法来计算你所能获取的最大利润. 只能一笔交易 cla ...

  8. 算法题_遍历三角矩阵

    思路:我们可以使用模拟的方法进行路径遍历. 接下来我们用C++进行编程: class Solution {private:static constexpr int directions[3][2] = ...

  9. java实现多边形游戏问题_动态规划-多边形游戏

    算法思想:动态规划 实际问题:多边形游戏 编写语言:Java 前言 多边形游戏问题是矩阵连乘的最优计算次序问题与凸多边形最优三角剖分问题的推广.我在解决凸多边形最优三角剖分问题时偶然间看到了这个结论, ...

  10. java动态规划 硬币_动态规划-硬币问题

    算法思想:动态规划 实际问题:硬币问题 编写语言:Java 问题描述 假设有 1 元,3 元,5 元的硬币若干(无限),现在需要凑出 n 元.问如何组合才能使硬币的数量最少? 关键特征 要推出问题的关 ...

最新文章

  1. 机器学习特征工程之特征缩放+无量纲化:最小最大缩放(MinMaxScaler)
  2. ProE官方网站系列视频教程
  3. 【设计模式】外观模式 ( 概念 | 适用场景 | 优缺点 | 代码示例 )
  4. mysql提高并行并行_oracle 并行之并行度篇
  5. 《You Only Look Once: Unified, Real-Time Object Detection》YOLO一种实时目标检测方法 阅读笔记(未完成版)
  6. DataContract 添加到 DataContractSet,因为已经存在数据协定名称也为命名空间
  7. Android 实践项目开发二
  8. 数据结构--数组+链表实现哈希表
  9. python mysql传入多个参数
  10. CSS伪元素与伪类的区别
  11. Python+os+openpyxl 批量获取Excel的文件名和最大行数
  12. JAVA 生成二维码 并设置 +失效机制
  13. 刺激战场灵敏度怎么调压枪最稳:花了4个小时调的灵敏度,适合所有段位
  14. 杨校老师课堂之集群内SSH免密登录功能配置
  15. 数据库系统概论--读书笔记--8 关系运算: 选择 投影 连接 除运算
  16. ThinkPHP多语言文件包含RCE(QVD-2022-46174)
  17. 用户行为分析面面观(之一)-----用户行为研究体系 + 特征1:差异性
  18. 十字路口的年轻人,选大厂、国企还是公务员?
  19. 基于java与springboot结合商品推荐算法实现商品推荐网站+商品管理系统后台,mysql,vue
  20. 班班通计算机工作总结,初中班班通培训工作总结

热门文章

  1. 游戏开发关卡设计(16)
  2. json rpgmv 加密_【RPG Maker MV插件编程】【实例教程6】存档的加密解密与保护
  3. c语言源代码如何读取打开文件,C语言读取文件
  4. BOS系统的设计与实现
  5. IV值和WOE值的理解
  6. 【安全】(三)Django之SQL注入防御
  7. 基于Java的进销存管理系统 附:源码课件
  8. SSH连接GitHub并配置ssh key
  9. 用C#.NET编写软件注册机
  10. 2010版gmp 计算机系统,2010版GMP附录:计算机化系统 整体及条款解读