C语言如何实现矩阵连乘(c语言,编程语言)

时间:2024-05-05 18:26:31 作者 : 石家庄SEO 分类 : 编程语言
  • TAG :

动态规划法

题目描述:给定n个矩阵{A1,A2....An},其中Ai与Ai+1是可以相乘的,判断这n个矩阵通过加括号的方式相乘,使得相乘的次数最少!

以矩阵链ABCD为例

按照矩阵链长度递增计算最优值

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

动归方程:

C语言如何实现矩阵连乘

分析:

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

c语言实现代码:

#include<stdio.h>#defineN20voidMatrixChain(intp[N],intn,intm[N][N],ints[N][N]){inti,j,t,k;intr;//记录相乘的矩阵个数变量for(i=1;i<=n;i++){m[i][i]=0;//当一个矩阵相乘时,相乘次数为0}//矩阵个数从两个开始一次递增for(r=2;r<=n;r++){//从某个矩阵开始for(i=1;i<=n-r+1;i++){//到某个矩阵的结束j=i+r-1;//拿到从i到j矩阵连乘的次数m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];//拿到矩阵连乘断开的位置s[i][j]=i;//寻找加括号不同,矩阵连乘次数的最小值,修改m数组,和断开的位置s数组for(k=i+1;k<j;k++){t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];if(t<m[i][j]){m[i][j]=t;s[i][j]=k;}}}}}intmain(void){intn,n1,m1,i,j=2;intp[N]={0};//存储矩阵的行和列数组intm[N][N]={0};//存储矩阵与矩阵相乘的最小次数ints[N][N]={0};//存储矩阵与矩阵相乘断开的位置printf("请输入矩阵个数:\n");scanf("%d",&n);for(i=1;i<=n;i++){printf("请输入第%d个矩阵的行和列(n1*m1格式):",i);scanf("%d*%d",&n1,&m1);if(i==1){p[0]=n1;p[1]=m1;}else{p[j++]=m1;}}printf("\n记录矩阵行和列:\n");for(i=0;i<=n;i++){printf("%d",p[i]);}printf("\n");MatrixChain(p,n,m,s);printf("\n矩阵相乘的最小次数矩阵为:\n");for(i=1;i<=n;i++){for(j=1;j<=n;j++){printf("%d",m[i][j]);}printf("\n");}printf("\n矩阵相乘断开的位置矩阵为:\n");for(i=1;i<=n;i++){for(j=1;j<=n;j++){printf("%d",s[i][j]);}printf("\n");}printf("矩阵最小相乘次数为:%d\n",m[1][n]);return0;}
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:C语言如何实现矩阵连乘的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:C语言中如何实现形参和实参下一篇:

21 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18