矩阵连乘问题

给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。如数据文件input.txt为:
6(矩阵个数)
30
35
15
5
10
20
25

#include <stdio.h>
#include <stdlib.h>//用来得到最优解的m[][],s[][];m存储矩阵相乘的最小运算量,主对角线上的值为0,依次求2个矩阵3个矩阵•、直到n个矩阵相乘的最小运算量,其中每次矩阵相乘的最小运算量都在
//上一次矩阵相乘的最小运算量的基础上求得,最后一次求得的值即为口个矩阵相乘的最小运算量
//s存储最优断开位置(加括号位置)
FILE *fp;
void MatrixChain(int p[6] ,int n, int m[][7],int s[][7]) {int r = 0;//当前参与矩阵连乘的元素的个数int i = 0;//记录起始下标int j = 0;//记录终止下标int k = 0;//表示当前还有的加括号int t = 0;//交换for (i = 1; i <= n; i++)m[i][i] = 0;//当只有一个矩阵时,乘法次数是0for (r = 2; r <= n;r++) //至少是两个矩阵参与连乘,最多有n个for (i = 1; i <= n - r + 1; i++) {//i<n-r+1,表示当R=3时,第一下标最多是4,才能组成(A4 A5 A6)保证其是三个.j = i + r - 1;//当起始下标和个数确定之后,终止下标是固定的m[i][j] = m[i][i] + m[i + 1][j] + p[i - 1] * p[i] * p[j];//都默认从起始下标之后加第一个括号,即当作从第一个断开得到初始值s[i][j] = i;for (k = i + 1; k < j; k++) {//从第二层循环开始,也就是当r>2时,还会有j-i种加括号的方法t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];if (t < m[i][j]) {//如果这j-中方法里还有比第一种方法小的,就交换.m[i][j] = t;s[i][j] = k;}}}
}void TrackBack(int i,int j, int s[][7])
{if(i == j) {printf("A%d ", i);fprintf(fp,"A%d ", i);}else{printf("(");fprintf(fp,"(");TrackBack(i,s[i][j],s);TrackBack(s[i][j]+1,j,s);fprintf(fp,")");printf(")");}
}int main() {FILE*fp1=NULL;int buff1[255];int i=0,n;fp1=fopen("juzhenliancheng_input","r");while(fscanf(fp1,"%d", &buff1[i])!=EOF){i++;}for(int j=0;j<i;j++){printf("%d ", buff1[j]);}printf("\n");n = buff1[0];int *p;p= (int *)malloc(n * sizeof(char));
//    int p[] ={};//p用来存放每一个矩阵的行数for(int k=1,i=0;i<=n;k++,i++)p[i]=buff1[k];int s[7][7] = {0};int m[7][7] = {0};if( (fp=fopen("juzhenliancheng_out.txt","w+")) == NULL ){puts("Fail to open file!");}MatrixChain(p, n, m, s);TrackBack(1, n, s);printf("矩阵最小相乘次数为:%d\n",m[1][n]);printf("\n矩阵相乘的最小次数矩阵为:\n");for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){printf("%d  \t",m[i][j]);}printf("\n");}printf("\n矩阵相乘断开的位置矩阵为:\n");for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){printf("%d ",s[i][j]);}printf("\n");}
}

矩阵连乘问题C语言实现相关推荐

  1. 电子琴仿真c语言程序,矩阵键盘模拟电子琴C语言程序设计

    原标题:矩阵键盘模拟电子琴C语言程序设计 //24c08地址为0xa0 #include #define uchar unsigned char unsigned char code table[]= ...

  2. 矩阵的转置用C语言怎么实现

    矩阵的转置用C语言可以使用两种方法实现:第一种是使用循环,可以使用两层循环来遍历矩阵中的每一个元素,然后交换每一个元素的行索引和列索引:另一种是使用矩阵乘法,首先将原矩阵的转置矩阵与原矩阵相乘,则可以 ...

  3. 矩阵的转置(C语言)

    在c语言中可以进行矩阵的转置,要求将A[2][3]转置为B[3][2],那么首先需要定义要给2行3列的二维矩阵,然后对矩阵进行键盘的输入:设置转置函数,然后输出转置之后的函数: //输入函数 void ...

  4. 白话空间统计之二十五:空间权重矩阵(四)R语言中的空间权重矩阵(5)完结篇:自然临近关系

    自然临近是R语言中spdep中内置的最后一种临近关系. 所谓的自然临近,指的是不进行任何的预设关系,通过其空间位置来判断是否属于相互临近,那么这个空间位置指的是什么呢?众所周知,在几何图形中,三角形是 ...

  5. c语言程序设计5*5矩阵求出,实用C语言程序设计教程5数组和矩阵ppt221.ppt

    实用C语言程序设计教程5数组和矩阵ppt221 C语言程序设计 - 第5章 数组和矩阵 第5章 构造数据-- 数组和矩阵 本章教学目标 1.理解C语言中数组的本质及其在内存的存储结构 2.应用数组表示 ...

  6. 白话空间统计之二十五:空间权重矩阵(四)R语言中的空间权重矩阵(2)

    上一篇,讲了R语言中的空间权重矩阵的结构,这一节讲讲R语言里面空间权重矩阵的自定义. 与ArcGIS自定义空间权重矩阵一样,R语言的空间权重矩阵如果纯粹从零开始自定义生成,是非常麻烦的事情,所以我们一 ...

  7. 白话空间统计之二十五:空间权重矩阵(四)R语言中的空间权重矩阵(4):K临近

    前面几节已经将spdep定义空间关系和转换为空间权重矩阵的方法及原理给大家做了个简单的介绍,本章将spdep中的其他几种空间关系做一个简单介绍,就当资讯存档了. 除去触点连接和距离范围(上一节描述的, ...

  8. moran指数 r语言_白话空间统计之二十五:空间权重矩阵(四)R语言中的空间权重矩阵(2):不同空间关系对莫兰指数的影响...

    原标题:白话空间统计之二十五:空间权重矩阵(四)R语言中的空间权重矩阵(2):不同空间关系对莫兰指数的影响 上一篇,讲了R语言中的空间权重矩阵的结构,这一节讲讲R语言里面空间权重矩阵的自定义. 与Ar ...

  9. 4*4按键扫描程序c语言,【资料】单片机4*4矩阵键盘扫描程序(c语言+汇编语言2个版本)...

    ;4X4矩阵键盘程序.主要原理为扫描键盘矩阵时,每次只有一行电平拉低.在逐次扫描拉低的这些行的同时,去读那些列的电平. ;被拉低的行上,按下的键对应的列的电平为0 ,其它为1. 用左移位的指令,在进位 ...

  10. 十字链表计算矩阵乘积 c语言,求用十字链表实现矩阵相加算法(C语言)急!!!...

    匿名用户 1级 2010-02-09 回答 我有一个可以用的.怎么给你?百度hi我吧. 算了,我贴上来吧,由电脑编程网整理: #include #include #define smax 45 typ ...

最新文章

  1. SonarQube代码质量管理工具安装与使用(sonarqube5.1.2 + sonar-runner-dist-2.4 + MySQL5.x)
  2. 把二元查找树转变成排序的双向链表(树)
  3. 电脑有回声_专递课堂互动教室现场有回声怎么办?
  4. 屏幕输出语句_C语言快速入门——表达式与语句
  5. python绘制数字23_Python 画数码数字8
  6. 瞬间读懂什么是互联网思维、大数据、O2O、众筹、红海
  7. cin指定输入截止符
  8. 2016百度之星复赛 1003 拍照 优先队列
  9. kdj指标主要看哪个值_终于有人把KDJ指标总结全了,值得收藏
  10. 二叉树的创建及各种遍历
  11. Linux 设置系统时间和时区2.Ubuntu
  12. 贪心算法 看这一篇就够了
  13. BtTracker原理
  14. Golang ToLower和ToLowerSpecial源码探究
  15. [Win Desktop] Windows 桌面应用推荐一
  16. 计算机图形学当前研究热点和发展方向,微软亚洲研究院网络图形组深入解释了图形学的现状、发展和未来...
  17. android连iphone热点超时,Android19连接iOS13个人热点失败
  18. 公钥加密与PKI实验
  19. 2022-04-13 工作记录--LayUI-动态渲染数据表格的表头参数
  20. oracle备份数据脚本,oracle数据库自动备份脚本

热门文章

  1. 开源项目:制作数据集,给图片画框和打标签
  2. 汽车以太网-SOME/IP之字节序(Network Byte Order-Big Endian)
  3. JAVA输出数组元素的三种方法(for/for each/toString)
  4. Flask Web开发--1.多租户SPC质量分析系统设计
  5. GUI显示系统之 SurfaceFlinger
  6. android+studio数独小游戏,‎App Store 上的“益智数独-每日一题挑战题,锻炼你的大脑”...
  7. JS大坑之17位以后的Number类型数值精度丢失问题
  8. 2000-2018年286个地级市PM2.5数据
  9. python怎么用sin函数_Python sin() 函数
  10. windows10怎样更换即将过期的产品密钥?