动态规划—矩阵链相乘

用动态规划求解矩阵链相乘的最少乘积次数的问题(C++实现) 用动态规划求解矩阵链相乘的最少乘积次数的问题 矩阵链相乘 的问题描述 我们就不具体阐述这个问题的定义了。为了能够更加直白地让读者了解什么是矩阵链相乘的最小乘积次数问题,我们举个简单的例子: 假设有三个矩阵,分别是 M1M_1M1​: (1111111111) \begin{pmatrix} 1 & 1 \\ 1 & 1 \\ 1 &a... 阅读详情

题目描述

用加括号的方式给出最优的矩阵相乘方案

输入
多组数据输入

第一行一个整数 nnn,表示矩阵链的长度(1<=n<=300)

接下来一行n+1n+1n+1个数表示这些矩阵的行数和列数

输出
对于每组数据,输出两行,第一行为计算次数,第二行为计算方案,用加括号的方式给出最优的矩阵相乘方案

如果不幸最优方案不唯一,选择优先计算左边的矩阵

输入样例

3
10 30 5 60
3
10 20 5 4

输出样例

4500
((A1A2)A3)
1200
((A1A2)A3)

Hint
在第二组样例中,选择((A1A2)A3)时,结果为10×20×5+10×5×4=1200

选择A1(A2A3)时,结果为20×5×4 + 10×20×4 = 1200

这时选择第一种,优先计算左边的!

思路分析

对于Ai到Aj矩阵链,假设我们知道应该从Ak后面截开,则相乘次数为Ai到Ak的次数加上A(k+1)到Aj的次数加上合并次数Ai行数Ak列数Aj列数
那么让k从Ai到A(j-1)遍历,找到使相乘次数最小的k即可

动态规划填表法:设置一个dp[i][j]存储矩阵Ai到Aj相乘的最小次数
i==j时,一个矩阵不需要相乘,次数为0
i!=j时,遍历循环控制变量l=j-i等于1、2、……、n-1的所有情况,需要用的时候查表即可获得子串的相乘次数,然后做出选择
(j-i从小到大遍历,需要子串相乘次数时dp中已经存在)
设置一个s[i][j]存储k表示Ai到Aj矩阵连乘应该从k出断开,即Ai到Ak、A(k+1)到Aj

AC代码

#include<stdio.h>
#define maxnum 100000000
int a[310];
int dp[310][310]={0},s[310][310];
void chain(int a[],int n);
void paint(int i,int j);
int main()
{
	int i,n;
	while((scanf("%d",&n))!=EOF)
	{
		for(i=0;i<=n;i++)
		  scanf("%d",&a[i]);  //矩阵Ai的行列为A[i-1][i]
		chain(a,n);
		printf("%d\n",dp[1][n]);
		paint(1,n);
		printf("\n");
	}
}
void chain(int a[],int n)
{
	int i,j,l,k,temp;
	for(l=1;l<=n-1;l++)
	{
		for(i=1;i<=n-l;i++)
		{
			j=i+l;
			dp[i][j]=maxnum;
			for(k=i;k<=j-1;k++)
			{
				temp=dp[i][k]+dp[k+1][j]+a[i-1]*a[k]*a[j];
				if(temp<=dp[i][j])
				{//这里的等于体现了左边优先
					dp[i][j]=temp;
					s[i][j]=k;
				}
			}
		}
	}
}
void paint(int i,int j)
{
	if(i==j)  printf("A%d",i);
	else
	{
		printf("(");
		paint(i,s[i][j]);
		paint(s[i][j]+1,j);
		printf(")");
	}
}
算法设计与分析实验八——动态规划之矩阵链相乘 问题描述 设A1, A2, A3…, An为n个矩阵序列,其中Ai为Pi-1 * Pi阶矩阵,这个矩阵链的输入用向量P=< P0, P1,…,Pn>给出,给定向量,确定一种乘法次序,使得基本运算的总次数达到最小。 解析 伪代码(迭代算法) 原码 #include <bits/stdc++.h> using namespace std; const int siz... 阅读详情

相关推荐

以空间换时间——动态规划算法及其应用:矩阵链相乘

动态规划算法是5大算法基础中最重要的一个,它专门用来解决平面世界下的应用,即会多次使用二维数组。 当然动态规划算法是空间换时间的算法,也就是说:我们可以利用空间资源来使某算法问题的时间复杂度降到最低。 当然算法题中,动态规划也是占了一大部分 说到以空间换时间,上一篇中的锦标赛算法就是一个以空间换时间的算法。锦标赛算法创建了一个2倍的原始数组的临时数组,是用来保存原始数组中的数,和相互比较的结果;...

qq_41926985的博客 2993

矩阵连乘(C语言)

矩阵连乘(C语言) 参考链接:https://blog.youkuaiyun.com/qq_32919451/article/details/80643118 问题描述 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。例如,给定三个连乘矩阵{A1,A2,A3}的维数分别是10 * 100,100 * 5和5 * 50,采用(A1A2)A3,乘法次数为101005+10550=7500次,而采用A1

Weightlessly的博客 7902

uniapp实战:mui-player插件如何完美适配m3u8/flv直播流(附完整代码)

本文详细介绍了如何在Uniapp中使用mui-player插件完美适配m3u8和flv直播流,提供从基础配置到高级优化的全流程解决方案。通过动态加载策略、响应式布局和内存管理,实现跨平台稳定播放,适用于企业级直播应用开发。

weixin_29001655的博客 235

矩阵连乘最佳加括号方式-动态规划算法

一、问题描述 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2,…,n-1。要算出这n个矩阵的连乘积A1A2…An。由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘...

weixin_30381317的博客 1570

PHP实战:5分钟搞定SM4国密加密算法集成(附完整代码)

本文提供了一份可直接用于生产环境的PHP SM4国密加密算法集成实战指南。文章详细解析了SM4算法核心,对比了ECB与CBC工作模式,并给出了包含完整代码、密钥管理、数据填充及性能优化的解决方案,帮助开发者快速、安全地在PHP项目中集成国密加密算法。

2a4s6d8f0g的博客 339

python 携程登陆_Python 学习练习之用户登录接口

目的:用python实现简单用户注册,登陆,加黑功能,放个流程图吧。以下内容仅为练习 执行流程:[root@zabbix login]# python user_login.pyusername:tompassword:123456Are you want to register ? [y/n]yRegister successful,Please relogin ![root@zabbix lo...

weixin_28679635的博客 516

编程实现矩阵连乘问题的求解

编程实现矩阵连乘问题的求解 问题描述: 在计算矩阵连乘积时,加括号的方式对计算量有影响。例如有三个矩阵A1,A2,A3连乘,它们的维数分别为 10x100,100x5,5x50。用第一种加括号方式(A1A2)A3计算,则所需数乘次数为 10x100x5+10x5x50=7500。用第二种加括号方式A1(A2A3)计算,需要 100x5x50+10x100x50=75000次数乘。输入连乘矩阵的个数,每个矩阵的维数。要求输出最少数乘次数。 相关知识 连乘次数 A是一个p x q的矩阵,B是一个q x r的矩阵

qq_46197017的博客 1320

【AUCell打分】:评估一个基因集在单细胞转录组的每个细胞中特定的活性程度

AUCell使用曲线下面积来计算输入基因集的一个有意义的基因子集是否在每个细胞的表达基因中富集。AUC 分数在所有细胞中的分布允许探索特征的相对表达。由于评分方法是基于排名的,因此 AUCell 与基因表达单位和归一化程序无关。此外,由于细胞是单独评估的,因此可以很容易地应用于更大的数据集。

weixin_40695088的博客 1万+

矩阵连乘积 c语言程序,(用括号表示出结果)矩阵连乘C语言描述

1.矩阵连乘矩阵相乘:矩阵A和B相乘,p、q分别为A的行和列,q、r分别为B的行和列:所以A和B相乘,两个矩阵相乘的计算量为pqr。1.1 完全加括号的矩阵连乘积完全加括号的矩阵连乘积可递归地定义为:单个矩阵是完全加括号的;矩阵连乘积 A是完全加括号的,则 A 可表示为2个完全加括号的矩阵连乘积 B 和 C 的乘积并加括号,即 A = (BC) 。由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许...

weixin_30706851的博客 1749

Python 逆向解析知乎盐选反爬字体,实现内容精准还原

本文详细解析了知乎盐选内容的反爬字体机制,并提供了使用Python逆向解析WOFF字体文件的完整方案。通过fontTools库构建解码字典,实现乱码文本的精准还原,帮助开发者应对动态字体策略,同时强调法律与道德风险。

weixin_29268385的博客 1295

YOLO模型从10MB瘦到2MB!剪枝+INT8量化双方案(精度损失<1%,附部署代码)

摘要:本文介绍了一种针对边缘设备的YOLO模型轻量化方案,通过"结构化剪枝+INT8量化"组合技术,将YOLOv8n模型从6.4MB压缩至2MB,体积减少68.75%,推理速度提升80%,同时保持精度损失小于1%。文章详细讲解了剪枝工具选择、通道剪枝实现、量化校准等关键步骤,并提供了完整的代码示例。特别强调了剪枝保留率、校准集使用、微调必要性等实践要点,帮助开发者在树莓派等资源受限设备上实现高效目标检测。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 756

动态规划之矩阵连乘问题

给定n个矩阵{A1,A2,…,An},其中,Ai与Ai+1是可乘的,(i=1,2 ,…,n-1)。用加括号的方法表示矩阵连乘的次序,不同的计算次序计算量(乘法次数)是不同的,找出一种加括号的方法,使得矩阵连乘的次数最小。要求:输入 矩阵数,各矩阵行数和列数P(p0,p1,…pn)输出 矩阵连乘的最优值和最优解。

m0_67587248的博客 731

基于STM32的智能浇花系统毕业设计(全部资料)

摘要:本文设计了一种基于STM32单片机的智能浇花系统,集成了环境温湿度检测、土壤温湿度监测、LCD显示、Wi-Fi联网及手机APP远程控制等功能。系统通过传感器实时采集环境参数,自动控制水泵工作实现智能灌溉,同时支持用户通过手机APP远程监控和调节。论文详细阐述了硬件选型、软件设计及系统测试过程,验证了系统的稳定性和实用性。该设计为家庭园艺提供了智能化解决方案,具有节水高效、操作便捷等特点。关键词:STM32;智能灌溉;远程控制;环境监测;Wi-Fi通信。

3254968421的博客 1194

动态规划——矩阵链相乘

动态规划之矩阵链相乘

Wu_L7的博客 1万+

通俗易懂的Harris 角点检测

点击上方“3D视觉工坊”,选择“星标”干货第一时间送达Harris 角点检测 认为特征点具有局部差异性。如何描述“特征点具有局部差异性”:以每一个点为中心,取一个窗口,窗口大小为5*5...

3D视觉工坊 1473

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

矩阵链相乘(动态规划法)

矩阵链相乘问题是一个经典的动态规划问题。给定一系列矩阵,目标是找到一种最优的乘法顺序,使得所有矩阵相乘所需的标量乘法次数最少。矩阵链相乘问题的关键在于利用动态规划来避免重复计算子问题。

2301_79582459的博客 1687

VC中sqlite的使用

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

动态规划解决矩阵链相乘问题

#include #define MAXN 200 #define INF 99999999 int m[MAXN][MAXN], s[MAXN][MAXN]; //m[i][j]存放第i~j个矩阵相乘所需的最小代价,s[i][j]存放的是第i~j个矩阵代价最小时中间划分的位置; int p[MAXN]; void matrixMin(int n) { for(int i = 1; i

朝圣路 829

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

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

矩阵链相乘的最少乘法次数(动态规划解法)

矩阵链相乘问题是动态规划的经典应用,旨在寻找最优的矩阵相乘顺序以最小化乘法运算次数。通过分析不同分割点的情况,利用最优子结构性质建立状态转移方程:dp[i][j] = min{dp[i][k] + dp[k+1][j] + nums[i]*nums[j+1]*nums[k+1]}。采用自底向上的递推方法,先计算短链的最优解,再逐步扩展到整个矩阵链。典型实现的时间复杂度为O(n³),空间复杂度为O(n²),能高效解决问题。

2301_80567637的博客 1091

动态规划:矩阵链相乘问题(java)——06

矩阵链相乘问题 问题描述 算法思路 确定子问题:子问题就是减少问题规模,这道题很明显问题规模就是矩阵链的长度,也就是说在求长度为5的矩阵链的时候,可能会用到之前求长度为4,3的子问题的结果 最优子结构:也就是说我们每次求的子问题,都是最优的结构 这里我们设 F(i, j) 表示从Ai到Aj矩阵链的最少次数 算法思路:举例说明:要求F(1,5) = A1,A2,A3,A4,A5 。我们可以先看看有多少种情况 A1 |(A2,A3,A4,A5) 此时F(1,5) = F(1) (A1,A

weixin_44844089的博客 590

算法之路__19、动态规划之矩阵链相乘

动态规划之矩阵链相乘 问题描述 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。 确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 思路: 构造递归解 设m[i,j]为矩阵链Ai…Aj的最优解的代价,则 ┌ 0 如果i = j m[i,j] = │ └ min(i≤k<j) {m[i,k] ...

郭岚的博客 3673

动态规划详解(第三讲)——矩阵链相乘

这类题目体现了DP的实质,也是经典问题。(•̀˓◞•́) 假设我们要用标准的矩阵乘法计算M1M1M_1、M2M2M_2、M3M3M_3的乘积M1M2M3M1M2M3M_1M_2M_3,这三个矩阵的维数分别是2x10,10x2,2x10。 如果我们先把M1M1M_1和M2M2M_2相乘,然后把结果和M3M3M_3相乘,即((M1M2)M3)((M1M2)M3)((M_1M_2)M_3)。那么要...

Neo_kh 6702

动态规划 矩阵链相乘

1. 问题 设S1,A2,A3,…An为n个矩阵的序列,其中Ai为Pi-1×Pi阶矩阵,这个矩阵链的输入用向量P=<P0,P1…Pn>给出。 给定向量P,确定一种乘法次序,使得基本运算的总次数达到最小。 2. 解析 我才用的矩阵为 A1(30×35)、 A2(35×15)、 A3(15×5)、 A4(5×10)、 A5(10×20)、 A6(20×25), 那么得到的P=<30,...

Alen880的博客 588

动态规划之矩阵链相乘问题(算法导论)

问题描述:

liuwu265的专栏 1502

动态规划算法的理解---矩阵链相乘问题

引言:最近刷leetcode的过程中,感觉动态规划算法应用的不知所以,另外觉得自己的代码无法从理论上说服自己。同时,有些题不知从什么角度去分析,以及一步一步应用动态规划的思想解题。因此,写下这篇文章,来学习应用动态规划的一般思路 。 ...

weixin_44871341的博客 1315

算法导论之动态规划:矩阵链相乘

矩阵链相乘问题:给定n个矩阵的链<A1,A2,A3……,An>,矩阵Ai的规模为p(i-1)*pi(1<=i<=n),求完全括号化方案,使得计算乘积A1,A2,A3……An所需标量乘法次数最少。

WSYW126的博客 1237
上一篇: 堆
下一篇: 动态规划—钢管切割问题
拍坛对酒
博客等级 码龄6年 83粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值