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

这篇具有很好参考价值的文章主要介绍了矩阵链相乘的乘法次数(动态规划)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Description
设 A1, A2, …, An 为矩阵序列,Ai 是阶为 Pi − 1 * Pi 的矩阵 i = 1, 2, …, n.

试确定矩阵的乘法顺序,使得计算 A1A2…An 过程中元素相乘的总次数最少.

Input
多组数据

第一行一个整数 n(1≤n≤300) ,表示一共有 n 个矩阵.

第二行 n + 1 个整数 P0, P1, …, Pn(1≤Pi≤100) ,第i个矩阵的行数为Pi − 1,列数为Pi.

Output
对于每组数据输出最少的元素乘法次数.

Sample Input
5
74 16 58 58 88 80 
5 
10 1 50 50 20 5 
Sample Output
342848
3650

该题是算法动态规划练习题

该题首先要清楚地认识和理解题意

首先,理解一次矩阵乘法会产生多少次乘法运算

矩阵相乘的乘法次数,(算法+例题)讲解,矩阵,动态规划,算法

例如给定两个矩阵(10 * 5)与(5 * 20)

会产生的乘法次数为 10*5*20=1000次

然后我们要理解当存在多个矩阵相乘时,乘的顺序不同,最终乘法运算的总次数也是不同的!

矩阵相乘的乘法次数,(算法+例题)讲解,矩阵,动态规划,算法 

到这里,我们按照动态规划的思想开始解答

我们先定义一个数组来存储子问题,这里dp[i][j]定义为矩阵[i,j]相乘的最小总次数(其中1<=i<=j<=n,n为矩阵个数)

然后就是找到子问题和子问题之间的关系(求递推方程)

很明显的是当i==j时,此时只有一个矩阵,因此乘法运算次数肯定为0

而j==i+1时,此时只有两个矩阵,因此乘法运算次数肯定为这两个矩阵的相乘乘法次数  

再往上推,当有三个矩阵时,我们需要进行划分了,即划分为左边两个矩阵先乘还是右边两个矩阵先乘

因此这里我们定义一个划分变量k,定义i<=k<j,这样定义是为了方便后续计算

例如只有两个矩阵的时候,我们计算乘法次数公式就可以定义为p[i-1]*p[k]*p[j],

矩阵相乘的乘法次数,(算法+例题)讲解,矩阵,动态规划,算法

 然后对每一次划分的结果都进行计算乘法次数,同时取最小值不断更新我们的dp数组即可

下面给出两个版本文章来源地址https://www.toymoban.com/news/detail-822523.html

#include<cstdio>

using namespace std;

int MAX=310,inf=0x3f3f3f3f;
int n;
int p[310];
int dp[310][310];//dp[i][j]定义为矩阵[i,j]相乘的最小总次数 

int fun(int i,int j){//计算矩阵[i,j]相乘的最小总次数 (左闭右闭)
	for(int k=i;k<j;k++){//枚举划分的位置 
		int temp=fun(i,k)+fun(k+1,j)+p[i-1]*p[k]*p[j];
		if(temp<dp[i][j]){
			dp[i][j]=temp;
		}
	}
	return dp[i][j];
}

int main(){
	while(scanf("%d",&n)!=EOF){
		for(int i=0;i<=n;i++){
			scanf("%d",&p[i]);
		}
		for(int i=0;i<MAX;i++){
			for(int j=0;j<MAX;j++){
				if(i==j){
					dp[i][j]=0;
				}else{
					dp[i][j]=inf;//初始化 
				}
			}
		}
		int res=fun(1,n);
		printf("%d\n",res);
	}
	
	return 0;
} 
#include<cstdio>

using namespace std;

int MAX=310,inf=0x3f3f3f3f;
int n;
int p[310];
int dp[310][310];//dp[i][j]定义为矩阵[i,j]相乘的最小总次数 

void fun(int beg,int endd){//计算矩阵[i,j]相乘的最小总次数 (左闭右闭)
	for(int r=2;r<=n;r++){//子问题的大小 
		for(int i=1;i<=n-r+1;i++){//左边界 
			int j=i+r-1;//右边界 
			for(int k=i;k<j;k++){//枚举划分 
				int temp=dp[i][k]+dp[k+1][j]+p[i-1]*p[k]*p[j];
				if(temp<dp[i][j]){
					dp[i][j]=temp;
				}
			}
		}
	}
}

int main(){
	while(scanf("%d",&n)!=EOF){
		for(int i=0;i<=n;i++){
			scanf("%d",&p[i]);
		}
		for(int i=0;i<MAX;i++){
			for(int j=0;j<MAX;j++){
				if(i==j){
					dp[i][j]=0;
				}else{
					dp[i][j]=inf;//初始化 
				}
			}
		}
		fun(1,n);
		int res=dp[1][n];
		printf("%d\n",res);
	}
	
	return 0;
} 

到了这里,关于矩阵链相乘的乘法次数(动态规划)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法导论【分治思想】—大数乘法、矩阵相乘、残缺棋盘

    在分而治之的方法中,一个问题被划分为较小的问题,然后较小的问题被独立地解决,最后较小问题的解决方案被组合成一个大问题的解决。 通常,分治算法有三个部分: 分解:将问题划分为若干子问题,这些子问题是同一问题的较小实例。 解决:通过递归地解决子问题来

    2024年02月03日
    浏览(29)
  • C语言求任意两个矩阵相乘的算法(初学尝试矩阵乘法)

    C语言求任意两个矩阵相乘的算法(不同于大部分规格固定的矩阵乘法) 结果图如下   :                           代码如下: //----- 任意两个矩阵相乘 # include stdio.h int main (void) {     char ch;     int a, b, c, d;     printf (\\\"此算法用于任意两个矩阵相乘  n矩阵1(a行b列)

    2023年04月08日
    浏览(42)
  • 动态规划--矩阵链相乘问题

    明确原始问题A[1:n]: 计算矩阵链 所需的 最小乘法次数。 (1)是否满足最优子结构,问题的解是否包含子问题的优化解? 若计算A[1:n]的优化顺序在 k 处断开矩阵链,即A[1:n]=A[1:k]×A[k+1:n],则在A[1:n]的优化顺序中,对应于子问题A[1:k]的解必须是A[1:k]的优化解,对应A[k+1:n]的解必

    2024年01月25日
    浏览(32)
  • 矩阵链相乘(动态规划法)

    矩阵链乘法是耳熟能详的问题了,有很多矩阵,排列成矩阵链,矩阵链的要求是相邻的两个是可以相乘的,可以相乘是有条件的,两个矩阵能够相乘的条件就是行、列之间是有关系的,两个矩阵如果能够相乘,就是前面矩阵的列号和后面矩阵的行号是一致的。 如何确定矩阵的

    2024年02月09日
    浏览(35)
  • 动态规划详细讲解c++|经典例题讲解认识动态规划|0-1背包问题详解

    uu们,你们好!这次的分享是动态规划,其中介绍了动态规划的相关概念和做题模板(三要素),同时为了uu们对动态规划方法有更加形象的认识,特地找了两个经典问题,和大家一起分析。并且呢,为了大家检验自己的学习成果,我专门在常用的oj上为uu们找到了相关题目的

    2024年04月11日
    浏览(48)
  • 7-1 矩阵链相乘问题 (20 分)(思路+详解+题目解析) 动态规划做法

    2:关于本题的矩阵乘法和递推方程的得出 3:实例演示 三:思路 =================================================================== 思路:这里在考虑的的时候,因为是多个矩阵相乘,求的最小乘法次数, 比如 A1_A2_A3_A4, 那么根据划分的不同,那么其乘法顺序也会不同,继而所求的乘法次数

    2024年04月09日
    浏览(57)
  • 动态规划:矩阵连乘问题(文末附有手写版例题)

    A是一个p × q矩阵,B是一个q × r矩阵,AB相乘,得到的矩阵元素个数为p × r,每个元素由q次乘法得到,因此所需乘法次数为p × q × r。 在计算矩阵连乘积时,加括号的方式对计算量有影响。 例如有三个矩阵A1,A2,Ag连乘,它们的维数分别为 10x100,100×5,5×50。用第一种加括号方

    2024年02月04日
    浏览(33)
  • 【状态机dp 动态规划】100290. 使矩阵满足条件的最少操作次数

    动态规划汇总 状态机dp 给你一个大小为 m x n 的二维矩形 grid 。每次 操作 中,你可以将 任一 格子的值修改为 任意 非负整数。完成所有操作后,你需要确保每个格子 grid[i][j] 的值满足: 如果下面相邻格子存在的话,它们的值相等,也就是 grid[i][j] == grid[i + 1][j](如果存在)

    2024年04月24日
    浏览(27)
  • [算法]动态规划以及常见例题

    之前买的假书害人捏......不过有个问题没说错,动态规划和递归很相似,但是动态规划利用分治法 ,把大问题转化为子任务,当计算出 一个子任务的结果将储存 起来, 避免对于同一个子任务的重复计算 但其实根据某本书的写法,就是给递归套了一层存储的壳子......这个做法其实其

    2024年02月04日
    浏览(31)
  • 算法设计与分析—动态规划例题

    题目描述 求FIB数列第n项的值 输入 输入一个整数n,表示需要输出FIB数列第n项的值 输出 输出FIB数列第n项的值 样例输入  复制 样例输出  复制 提示 题目描述 长江游艇俱乐部在长江上设置了n (n=10)个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的

    2024年04月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包