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示例)

