一、问题描述

给定n个数字矩阵A1,A2,…,An,其中Ai与Ai+1是可乘的,设Ai是pi-1*pi矩阵, i=1,2,…,n。求矩阵连乘A1A2...An的加括号方法,使得所用的乘次数最少。

例子

三个矩阵连乘,可以有(A1A2)A3和A1(A2A3)两种方法求积 ,乘法次数分别为: p0p1p2+p0p2p3和p0p1p3+p1p2p3

假设p0=10, p1=100, p2=5, p3=50, 两种方法的次数分别是:7500 和 75000

明显可以看出,两种乘法在效率上是有较大差异的,计算机实现乘法比实现加法要复杂,所以如何使乘法次数最小是一个值得探究的问题

如果使用蛮力算法,对所有可能的加括号方法递归搜索,则:

时间复杂度为指数级别,那么就需要有更优的方法来计算最佳的矩阵连乘方法

二、最优子结构性质

维基百科:如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)

通常来说,一个问题可以使用动态规划求解,必须具有最优子结构性质。所以,如果我们证明该问题具有最优子结构性质,我们就可以使用动态规划的方法来得到它的最优解,通常可以使用反证法进行证明。

证明:

设(A1…Ak)(Ak+1…An) 具有最少乘法次数,则(A1…Ak)中加括号的方法使A1..Ak乘法次数最少。否则设存在另一种加括号方法(A1…Ak)'更优,则(A1…Ak)'(Ak+1…An) 比 (A1…Ak)(Ak+1…An) 更优,矛盾。同理, (Ak+1…An) 内的连乘方法也是最优的。

三、实现

用m[i][j]表示Ai到Aj连乘的最小次数,则有递推关系:

这里使用一种自底向上的动态填表的方式来进行求解。

由上式及下表可以知道,每当我们要求得一个m[i][j]的值时,都需要知道它左边位置和下边位置所有的值,这样来理解的话就很容易实现了。

i/j

1

2

3

4

5

6

1

0

0

0

0

0

0

2

0

0

0

0

0

3

0

0

0

0

4

0

0

0

5

0

0

6

0

算法过程示例

6个矩阵连乘:P=[30,35,15,5,10,20,25]

计算过程:

i/j

1

2

3

4

5

6

1

0

15750

7875

9375

11875

15125

2

0

2625

4375

7125

10500

3

0

750

2500

5375

4

0

1000

3500

5

0

5000

6

0

还可以增加一个矩阵记录分割点,求得m[i][j]值的那一个k点即为最佳分割点。

该算法的时间复杂度为

O(n^3)

代码示例

#include

using namespace std;

//矩阵连乘问题的解

int MatrixChainOrder(int n,int p[],int a, int b){

int m[n+1][n+1], s[n+1][n+1];//m记录乘法操作次数,s记录分割点k

for(int i = 1;i <= n;i++){

m[i][i] = 0;

s[i][i] = 0;

}

for(int i = n-1;i >= 1;i--){

for(int j = i+1;j <= n;j++){

m[i][j] = 10000000;

for(int k = i;k <= j-1;k++){

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

if(sum < m[i][j]){

m[i][j] = sum;

s[i][j] = k;

}

}

}

}

printf("%d %d", m[a][b], s[a][b]);

}

int main(){

int n, i, j;

cin >> n;

int p[n+1];

for(int i = 0;i < n+1;i++)cin >> p[i];//第i个矩阵为pi*p(i+1)

cin >> i >> j;

MatrixChainOrder(n, p, i, j);

}

python矩阵连乘_动态规划:矩阵连乘问题相关推荐

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

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

  2. 将矩阵转为一行_理解矩阵乘法

    理解矩阵乘法 考研需要考一门课<线性代数>,这门课其实是教矩阵. 刚学的时候,还蛮简单的,矩阵加法就是相同位置的数字加一下. 矩阵乘法也类似,矩阵乘以一个常数,就是所有位置都乘以这个数. ...

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

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

  4. python 怎么取对数_概率矩阵分解(PMF)及MovieLens上的Python代码

    首先对Probabilistic Matrix Factorization这篇论文的核心公式进行讲解和推导:然后用Python代码在Movielens数据集上进行测试实验. 一. 背景知识 文中作者提 ...

  5. python矩阵行秩函数_为什么矩阵行秩等于列秩?

    挖坟 最近整理一些基础知识的时候,也被这个问题困惑着. 书上的解释是,任何矩阵通过初等变换都可以化成标准型(单位阵+一些全零行或列).显然行秩和列秩是相等的. 但是相比代数上的解释,我更想要寻求几何上 ...

  6. dpresult在python中什么意思_动态规划(DP)的整理-Python描述

    今天整理了一下关于动态规划的内容,道理都知道,但是python来描述的方面参考较少,整理如下,希望对你有所帮助,实验代码均经过测试. 请先好好阅读如下内容--什么是动态规划? 摘录于<算法图解& ...

  7. python判断矩阵是否对称_矩阵的特征分解(推导+手算+python计算+对称矩阵的特征分解性质)...

     1. 前言 最近几天一直在学习矩阵的知识,恶补了特征分解和SVD算法,发现网上很多资料都是不全的,所以想记录一下这里面的特征分解推导过程. 2.矩阵的进阶知识 2.1 特征分解(谱分解)=> ...

  8. python实现矩阵叉乘_矩阵乘法的纯Python实现 | 离开Python库!!

    点击关注我哦 一篇文章带你了解矩阵乘法的纯Python实现 在<这篇文章>中,我们有简单提到"矩阵乘法"的相关知识,如果你不记得了,可以复习一下这张图片. 想起来了没? ...

  9. c++矩阵连乘的动态规划算法并输出_算法面试必修课,动态规划基础题型归纳(三)

    动态规划(Dynamic Programming,简称DP),是大家都觉得比较难以掌握的算法.为了应付面试,我们经常会背诵一下DP问题的源码,其实,只要理解了思想,掌握基本的模型,然后再来点写代码的套 ...

  10. python矩阵相乘例题_百道Python入门级练习题(新手友好)第一回合——矩阵乘法...

    题目描述 [问题描述] 编写程序,完成3*4矩阵和4*3整数矩阵的乘法,输出结果矩阵. [输入形式] 一行,供24个整数.以先行后列顺序输入第一个矩阵,而后输入第二个矩阵. [输出形式] 先行后列顺序 ...

最新文章

  1. 最近刷爆朋友圈的一道面试题
  2. Exchange2007 中Send as 与Send on behalf of 讲解
  3. html禁止手机文字放大,js实现移动端微信页面禁止字体放大
  4. clustering
  5. Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)...
  6. max导出fbx设置_真3D虚拟偶像制作教程——虚拟偶像人物模型导出前的处理
  7. linux 下 storm环境搭建,Storm在Ubuntu环境下的单机部署
  8. 【升级版】如何使用阿里云云解析API实现动态域名解析,搭建私有服务器【含可执行文件和源码】...
  9. 基于对象的JavaScript编程
  10. 南阳oj92--图像有用区域(Bfs)
  11. saltstack 远程执行之返回写入到mysql
  12. 金融现金贷用户数据分析和用户画像
  13. MulT: An End-to-End Multitask Learning Transformer 多任务共享注意力
  14. 2021年4月程序员工资统计排行
  15. 刘昊威新作—东田造型三里屯VILLAGE概念店
  16. Winrar制作自解压安装程序
  17. Oracle 设置 密码可以重复使用 the password cannot be reused
  18. ffmpeg实现g711音频和H264,H265封装mp4(整理,非原创)
  19. Microsoft 离线翻译引擎介绍
  20. 【Codeforces Round #547 (Div. 3)】 A B C D E F1 F2 G

热门文章

  1. 非递归获取二叉树中叶子结点的个数
  2. 数据分析与数据处理实例(某银行数据)
  3. Unity 粒子特效看不见
  4. 熊猫关键词工具v2.8.1.0绿色版SEO工具
  5. 微信测试是否被删软件,检测微信是否被删,这个方法超好用!
  6. 自适应滤波器(二)NLMS自适应滤波器
  7. 蜗轮蜗杆减速机如何选择制造厂
  8. jQuery视频播放器插件
  9. NGINX配置gzip请求自动解压
  10. SVN工具添加忽略上传文件和取消忽略文件