第3章 动态规划 矩阵连乘问题

矩阵乘法计算量估算 矩阵乘法计算量估算 描述 矩阵乘法的运算量与矩阵乘法的顺序强相关。 例如: A是一个50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵 计算ABC有两种顺序:((AB)C)或者(A(BC)),前者需要计算15000次乘法,后者只需要3500次。 编写程序计算不同的计算顺序需要进行的乘法次数。 本题含有多组样例输入! 数据范围:数据组数:1<=t<=10,矩阵个数:1<=n<=15,行列数:1<=rowi,coli<=100 进阶:时间复杂度:O(n),空间复杂度: 阅读详情

两个矩阵相乘的计算量


程序实现

//矩阵a和b相乘,p、q分别为a的行和列,q、r分别为b的行和列
void MatrixMultiply(int a[][MAXN], int b[][MAXN], int p, int q, int r)
{
	int sum[MAXN][MAXN];
	memset(sum, 0, sizeof(sum));

	int i, j, k;
	//遍历矩阵a的行
	for (k = 0; k < p; k++)
	{
		//遍历矩阵b的列
		for (j = 0; j < r; j++)
		{
			//对应位置相乘
			for (i = 0; i < q; i++)
			{
				sum[k][j] += a[k][i] * b[i][j];
			}
		}
	}
}

所以a、b两个矩阵相乘的计算量为p*q*r。


枚举所有完全加括号方式

ABCD四个矩阵连乘

1、(A(BCD))——>(A(B(CD))),(A((BC)D));
2、((AB)(CD))——>NULL;
3、((ABC)D)——>((A(BC)D)),(((AB)C)D);
对于上面四个矩阵来说,枚举方法是:
1、括号加在A和B之间,矩阵链被分为(A)和(BCD);
2、括号加在B和C之间,矩阵链被分为(AB)和(CD);
3、括号加在C和D之间,矩阵链被分为(ABC)和(D);
在第一步中分出的(A)已经不能在加括号了,所以结束;
而(BCD)继续按照上面的步奏把括号依次加在B和C、C和D之间,其他情况相同。
加括号的过程是递归的。

程序实现

//m数组内存放矩阵链的行列信息
//m[i-1]和m[i]分别为第i个矩阵的行和列(i = 1、2、3...)
int Best_Enum(int m[], int left, int right)
{
	//只有一个矩阵时,返回计算次数0
	if (left == right)
	{
		return 0;
	}

	int min = INF; //无穷大
	int i;
	//括号依次加在第1、2、3...n-1个矩阵后面
	for (i = left; i < right; i++)
	{
		//计算出这种完全加括号方式的计算次数
		int count = Best_Enum(m, left, i) + Best_Enum(m, i+1, right);
		count += m[left-1] * m[i] * m[right];
		//选出最小的
		if (count < min)
		{
			min = count;
		}
	}
	return min;
}


备忘录法优化


上图为递归枚举过程,小方块内的1:4代表第1个矩阵至第4个矩阵的完全加括号方式

可以看到黄色方块中有很多重复计算,所以利用备忘录来保存计算结果,在每次进行计算前,
先查表,看是否计算过,避免重复计算。

程序实现

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define SIZE 100
#define INF 999999999

int memo[SIZE][SIZE];

//m数组内存放矩阵链的行列信息
//m[i-1]和m[i]分别为第i个矩阵的行和列(i = 1、2、3...)
int Best_Memo(int m[], int left, int right)
{
	//只有一个矩阵时,返回计算次数0
	if (left == right)
	{
		return 0;
	}

	int min = INF;
	int i;
	//括号依次加在第1、2、3...n-1个矩阵后面
	for (i = left; i < right; i++)
	{
		//计算出这种完全加括号方式的计算次数
		int count;
		if (memo[left][i] == 0)
		{
			memo[left][i] = Best_Memo(m, left, i);
		}
		count = memo[left][i];
		if (memo[i+1][right] == 0)
		{
			memo[i+1][right] = Best_Memo(m, i+1, right);
		}
		count += memo[i+1][right];
		count += m[left-1] * m[i] * m[right];
		//选出最小的
		if (count < min)
		{
			min = count;
		}
	}
	return min;
}

int main(void)
{
	int m[SIZE];
	int n;
	while (scanf("%d", &n) != EOF)
	{
		int i;
		for (i = 0; i < n; i++)
		{
			scanf("%d", &m[i]);
		}
		memset(memo, 0, sizeof(memo));
		printf("%d\n", Best_Memo(m, 1, n-1));
	}
	return 0;
}

动态规划法


以矩阵链ABCD为例
按照矩阵链长度递增计算最优值
矩阵链长度为1时,分别计算出矩阵链A、B、C、D的最优值
矩阵链长度为2时,分别计算出矩阵链AB、BC、CD的最优值
矩阵链长度为3时,分别计算出矩阵链ABC、BCD的最优值
矩阵链长度为4时,计算出矩阵链ABCD的最优值

动归方程:




k为矩阵链断开的位置
d数组存放矩阵链计算的最优值,d[i][j]是以第i个矩阵为首,第j个矩阵为尾的矩阵链的最优值,i > 0
m数组内存放矩阵链的行列信息,m[i-1]和m[i]分别为第i个矩阵的行和列(i = 1、2、3...)

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define SIZE 100
#define INF 999999999

int m[SIZE];		//存放矩阵链的行列信息,m[i-1]和m[i]分别为第i个矩阵的行和列(i = 1、2、3...)
int d[SIZE][SIZE];	//存放矩阵链计算的最优值,d[i][j]为第i个矩阵到第j个矩阵的矩阵链的最优值,i > 0

int Best_DP(int n)
{
	//把d[i][i]置为0,1 <= i < n
	memset(d, 0, sizeof(d));

	int len;
	//递归计算矩阵链的连乘最优值
	//len = 1,代表矩阵链由两个矩阵构成
	for (len = 1; len < n; len++)
	{
		int i, j, k;
		for (i = 1, j = i+len; j < n; i++, j++)
		{
			int min = INF; //无穷大
			for (k = i; k < j; k++)
			{
				int count = d[i][k] + d[k+1][j] + m[i-1] * m[k] * m[j];
				if (count < min)
				{
					min = count;
				}
			}
			d[i][j] = min;
		}
	}
	return d[1][n-1];
}

int main(void)
{
	int n;
	while (scanf("%d", &n) != EOF)
	{
		int i;
		for (i = 0; i < n; i++)
		{
			scanf("%d", &m[i]);
		}

		printf("%d\n", Best_DP(n));
	}
	return 0;
}

003-1算法笔记【动态规划】矩阵相乘 问题 给定n个矩阵{A1,A2,…,An},其中,Ai与Ai+1是可乘的,(i=1,2 ,…,n-1)。用加括号的方法表示矩阵连乘的次序,不同的计算次序计算量(乘法次数)是不同的,找出一种加括号的方法,使得矩阵连乘的次数最小。 例如: A1是A(5*10)的方阵; A2是A(10*100)的方阵; A3是A(100*2)的方阵; 那么有两种加括号的方法: 1. (A1A2)A3; 2. A1(A2A3); 阅读详情

相关推荐

动态规划之矩阵连乘问题详细解读(思路解读+填表+代码)

动态规划简介 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填

weixin_44952817的博客 8万+

算法:矩阵乘法计算量估算

计算A*B*C有两种顺序:((AB)C)或者(A(BC)),前者需要计算15000次乘法,后者只需要3500次。计算的法则为一个字符串,仅由左右括号和大写字母('A'~'Z')组成,保证括号是匹配的且输入合法!输入多行,先输入要计算乘法的矩阵个数n,每个矩阵的行数,列数,总共2n的数,最后输入要计算的法则。数据范围:矩阵个数:1≤n≤15 ,行列数:1≤rowi​,coli​≤100 ,A是一个50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵。进阶:时间复杂度:O(n) ,空间复杂度:O(n)

A_man_only的专栏 788

动态规划解决矩阵连乘问题

给定n个矩阵{A1,A2,…,An},其中,Ai与Ai+1是可乘的,(i=1,2 ,…,n-1)。用加括号的方法表示矩阵连乘的次序,不同的计算次序计算量(乘法次数)是不同的,找出一种加括号的方法,使得矩阵连乘的次数最小。 ......

weixin_53113130的博客 6791

全连接层的算力(矩阵乘法)计算方式

神经网络的全链接层计算过程可以看成两个矩阵相乘,如下图所示,一个MxN的矩阵乘以一个NxP的矩阵,得到一个MxP的矩阵,进行乘法的次数为:(N)*(M*P)加法次数为:(N-1)*M*P所以,矩阵乘法总的计算量为(N)*(M*P)+(N-1)*M*P = (2N-1)*M*P每计算出一个结果,需要对一个N维向量作内积,内积需要进行N次乘法和N-1次加法(第一次计算不需要作加法,或者看成+0,就不需要-1了),计算一个结果的计算次数为2N-1.比如,就拿3*3的矩阵乘法为例:计算如下:所以,它的计算量为:乘法

tugouxp的专栏 7895

动态规划之矩阵连乘问题

目录 矩阵连乘问题简介 举例说明并详细分析 备注 代码块 测试结果 矩阵连乘问题简介1设计求解具体问题的动态规划算法的第一步是刻画该问题的最优解结构特征。为方便起见,将矩阵连乘积A(i)A(i+1)…A(j)简记为A[i:j]。考察计算A[1:n]的最优计算次序。设这个计算次序在矩阵A(k)和A(k+1)之间将矩阵链断开,(1<=k小于n),则其相应的完全加括号方式为((A1…Ak)(Ak+1…An

GailyYelp的博客 2970

动态规划:矩阵连乘问题

动态规划算法解决矩阵连乘问题,最优子结构的分析过程,初始值和边界值的分析以及递归方程的理解过程。

weixin_63497136的博客 1240

动态规划之矩阵连乘

问题描述:给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和每个矩阵规模,输出结果为计算矩阵连乘积的计算次序和最少数乘次数。       问题解析:由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。

ACM,再见! 1694

SAP FICO - 外币交易实战:汇率类型配置与货币换算率管理

月底关账前的外币评估就像财务人的"期末考",OB59配置就是你的备考方案。最低值原则(Lowest value principle)最保守。它会比较原始汇率与评估日汇率,取不利方向确认损失。适合风险厌恶型企业,我在制造业客户中应用最多。重估法(Revalue only)更反映市场现状。无论盈亏都按最新汇率调整,适合交易性金融资产处理。有个基金公司客户就靠这个方法及时反映了外汇波动收益。最小差异金额(Minimum difference)是防骚扰设置。

weixin_42524708的博客 355

动态规划---------矩阵连乘

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

qq_46016011的博客 1121

车载LIN总线避坑指南:主从节点通信失败的5个常见原因及解决方案

本文深度解析车载LIN总线主从节点通信失败的五大常见原因,涵盖物理层信号异常、调度表冲突、LDF配置错误、节点状态机缺陷及环境干扰。重点剖析了LDF文件配置不一致、波特率不匹配等关键问题,并提供了从示波器波形分析到软件配置检查的完整实战排查路径,帮助工程师高效定位并解决LIN通信故障。

g9h0i1的博客 1249

MTK Linux DRM分析(八)- KMS drm_crtc.c

CRTC 在 Linux DRM 子系统中是显示控制的核心,负责时序生成、模式设置和管线的调度。理解其工作原理和 API 对于进行底层图形开发、调试显示问题或 simply understanding how your graphics stack works 都至关重要。

iTom1900 1348

动态规划求解矩阵连乘

基本思想 动态规划算法与分治法类似,其基本思想是将待求解的问题分解成若干子问题,先求解子问题,再结合子问题的解得到原问题的解。与分治法不同的是,适合用动态规划法求解的问题经分解求解的子问题往往不是相互独立的。 若用分治法来解这类问题,则分解得到的子问题数目太多,以致最后解决原问题需要耗费指数级时间。然而,不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问斯被重复计算了许多次。如果能够保存已解决的子问题的答案,在需要时再找出已求得的答案,这样可以避免大量的重复计算,从而得到多项式时间算法。为了达到

weixin_53522240的博客 1万+

江科大笔记—OLED调试工具

OLED介绍及调试工具

m0_62005595的博客 655

矩阵连乘——动态规划算法

矩阵连乘——动态规划算法 目录 矩阵连乘——动态规划算法 预备知识 前言 问题 应用动态规划方法的步骤 按照步骤分析问题 步骤1:最有括号化方案的结构特征 步骤2:一个递归求解方案 步骤3:计算最优代价 步骤4:构造最优解 算法的核心代码 举例验证算法 算法复杂度分析 算法的基本要素 1、最优子结构 2、重叠子问题 3、备忘录方法 闲聊时刻 预备知识 了解...

weixin_45416043的博客 1万+

【WRF-CMAQ实战指南】从环境配置到测试案例运行全解析

本文详细解析了WRF-CMAQ从环境配置到测试案例运行的全过程,包括系统环境检查、依赖库安装、源码获取与项目初始化、关键配置技巧、编译实战与排错、测试案例运行验证等关键步骤。通过实战指南,帮助用户快速掌握WRF-CMAQ的安装和运行技巧,提升空气质量模拟的效率。

year5的博客 244

Python爬虫实战:抓取全球各国海关进出口数据的全流程教程

本文系统介绍了用Python采集全球各国海关进出口数据的完整流程,从数据源调研、技术选型,到代码实战、数据处理和存储,最后还拓展了进阶反爬和动态内容处理方法。希望这篇博文能帮助你掌握专业的数据采集技能,为后续数据分析和商业应用奠定坚实基础。

2201_76125261的博客 2362

动态规划之矩阵连乘问题C++版

动态规划矩阵连乘

于建章的博客 5590

从 on_event 到 lifespan:FastAPI 生命周期管理的旧方法与新方法对比与迁移

从 on_event 到 lifespan:FastAPI 生命周期管理的旧方法与新方法对比与迁移

XiaoqiangClub的博客 1021

『动态规划』矩阵连乘

完全加括号的矩阵连乘积可递归地定义为: - 单个矩阵是完全加括号的 - 矩阵连乘积A是完全加括号的,则A可表示为2个完全加括号的矩阵连乘积B和C 的乘积并加括号,即A=(BC) 设有四个矩阵A, B, C, D ,它们的维数分别是: `A = 50*10` `B = 10*40` `C = 40*30` `D = 30*5` ...

一个专注于客户端开发的技术er,不定期更新Android,Flutter,HormonyOS等方向的使用心得和感悟 3954

ArcGIS JSAPI 高级教程 - 添加多个 box 立方体 - 通过顶点、索引、UV 自定义每个 box、每个面不同颜色

ArcGIS JSAPI 高级教程 - 添加多个 box 立方体 - 通过顶点、索引、UV 自定义每个 box、每个面不同颜色。

非科班Java出身GISer的博客 400

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

动态规划——矩阵连乘问题(Java)

###纪小七### First of all:不知那年那月那日,我纪小七也头脑开窍、屁股开花了…这辈子一定要挣钱滋润自己!!! 讲一哈:动态规划 (1)动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到远问题的解。 (2)与分治法不同的是适合于用动态规划法求解的问题,经分解得到的子问题往往不是相互独立的。 (3)若用分治法解这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费指数时间。 (4)动态规划适用于解最优问题。 矩

qq_43692287的博客 3437

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【算法】动态规划 矩阵连乘问题 python

博主根据老师讲义,自己手撸代码,若有错误,多谢指出。直接上代码 目录 0 讲义 问题 动态规划算法→伪代码 举个例子说明 1 代码 迭代实现 输出连乘顺序 主函数 0 讲义 0.1 问题定义 0.2 问题分析 0.3 动态规划算法 0.4 伪代码 迭代实现动态规划code:迭代实现 0.5 举个例子说明 备忘录里的数据...

还有很长很长的路 3259

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

矩阵连乘积问题 动态规划算法

矩阵连乘积问题 动态规划算法动态规划动态规划问题的特征动态规划法的步骤矩阵连乘积问题分析动态规划法 求解分析最优解结构建立递归关系计算最优值算法计算矩阵连乘积的动态规划算法构造最优解 动态规划 动态规划问题的特征 动态规划算法的有效性依赖于问题本身所具有的两个重要性质: 1.最优子结构 当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质 2.子问题重叠 在使用递归算法自顶向下求解问题时,产生的子问题并不总是新问题,有些子问题被反复计算过,动态规划算法(自底向上)正是利用了子问题重叠性质,对

qq_43427808的博客 3426

动态规划法解决矩阵连乘问题

问题描述 矩阵连乘问题就是让我们找一个加括号的位置,使得加完括号之后矩阵的计算次数最小。这是一道典型的动态规划问题,而且和我们昨天讨论的题目动态规划解决多边形最优三角剖分很相似,大家可以参考一下。 题目分析 学过线性代数的朋友一定都知道矩阵相乘是有条件的,即AxB的条件是A矩阵的列数应该等于B矩阵的行数,这样两个矩阵才能相乘。 现在考虑三个矩阵的连乘运算,加括号方式会对整个计算量产生影响。现有矩...

weixin_44755413的博客 5120

3.1动态规划--矩阵连乘问题

动态规划--矩阵连乘(经典问题)不包含备忘录方法

m0_56147044的博客 2602
上一篇: 分解质因数——Poj 1142 Smith Numbers
下一篇: 动态规划——Poj 1651 Multiplication Puzzle
庞老板
博客等级 码龄15年 127粉丝 66原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

庞老板

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值