C语言矩阵连乘 (动态规划)详解

发布时间 - 2026-01-11 01:13:49    点击率:

动态规划法

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

以矩阵链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...)

c语言实现代码:

#include <stdio.h>
#define N 20 
void MatrixChain(int p[N],int n,int m[N][N],int s[N][N]){ 
  int i,j,t,k;   
  int r;             //记录相乘的矩阵个数变量 
  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; 
        } 
      } 
    } 
  }  
} 
 
int main(void){ 
  int n,n1,m1,i,j=2; 
  int p[N]={0};          //存储矩阵的行和列数组  
  int m[N][N]={0};        //存储矩阵与矩阵相乘的最小次数 
  int s[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]); 
  return 0; 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# C语言矩阵连乘  # (动态规划)  # C语言 深入探究动态规划之区间DP  # C语言深入探究动态规划之线性DP  # C语言动态规划多种背包问题分析讲解  # C语言动态规划点杀dp算法LeetCode炒股习题案例解析  # C语言动态规划之背包问题详解  # C语言使用DP动态规划思想解最大K乘积与乘积最大问题  # C语言 深入理解动态规划之计数类DP  # 最优  # 计算出  # 长度为  # 请输入  # 数为  # 希望能  # 分别为  # 为例  # 谢谢大家  # 最小值  # strong  # BCD  # ABC  # br  # gt  # CD  # Ai  # ABCD  # BC  # AB 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  phpredis提高消息队列的实时性方法(推荐)  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  如何获取上海专业网站定制建站电话?  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  三星、SK海力士获美批准:可向中国出口芯片制造设备  Swift中循环语句中的转移语句 break 和 continue  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  js实现获取鼠标当前的位置  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  如何挑选最适合建站的高性能VPS主机?  如何在香港免费服务器上快速搭建网站?  如何在橙子建站上传落地页?操作指南详解  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  如何快速查询域名建站关键信息?  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  香港服务器如何优化才能显著提升网站加载速度?  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  手机软键盘弹出时影响布局的解决方法  开心动漫网站制作软件下载,十分开心动画为何停播?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  ,交易猫的商品怎么发布到网站上去?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel如何集成Inertia.js与Vue/React?(安装配置)  JavaScript数据类型有哪些_如何准确判断一个变量的类型  Laravel如何实现数据库事务?(DB Facade示例)  如何在腾讯云服务器上快速搭建个人网站?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel如何实现用户密码重置功能?(完整流程代码)  百度浏览器如何管理插件 百度浏览器插件管理方法  如何在Windows服务器上快速搭建网站?  如何快速搭建高效WAP手机网站吸引移动用户?  EditPlus中的正则表达式 实战(2)  清除minerd进程的简单方法  LinuxCD持续部署教程_自动发布与回滚机制  油猴 教程,油猴搜脚本为什么会网页无法显示?  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  网站建设整体流程解析,建站其实很容易!  Laravel如何保护应用免受CSRF攻击?(原理和示例)  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  C++时间戳转换成日期时间的步骤和示例代码  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)