实现矩阵连乘积(动态规划)

news2025/7/20 17:18:59

cc8b9af695d241f1abcc6a424efd5529.jpeg

目录

实现矩阵连乘积

题目

问题分析

算法分析

时间复杂度

代码实现

执行结果

动态规划

基本思想

举例


个人主页:天寒雨落的博客_CSDN博客-初学者入门C语言,python,数据库领域博主
💬 热门专栏:初学者入门C语言_天寒雨落的博客-CSDN博客

每日赠语:没有窘迫的失败,就不会有自豪的成功;失败不可怕,只要能从失败中站起来。

实现矩阵连乘积

题目

给定n个矩阵{A1,A2,…,An},其中A(i)与A(i+1)是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。

问题分析

算法分析

RecurMatrixChain:A1,A2,…,An可乘。

令A1:p0xp1

    A2:p1xp2

    A3:p2xp3

    ......

    An:An-1xAn

注:以上数字均为下标

当n=2,A1A2:p0xp1xp2

当n=3,A1A2A3,此时根据矩阵乘法的结合律可分两种情况,去最优解即取要的数乘次数最少的:

  1. A1(A2A3):p1xp2xp3+p0xp1xp3(其中p1xp2xp3是A2A3的数乘次数,p0xp1xp3是p1和A2A3乘积结果后新的矩阵的数乘次数)
  2. (A1A2)A3:p0xp1xp2+p0xp2xp3(其中p0xp1xp2是A1A2的数乘次数,p0xp1xp3是p3和A1A2乘积结果后新的矩阵的数乘次数)

令f(n)为求解矩阵连乘积需要的最少数乘次数

f(n)=min{f(k)+f(n-k)+p0xpkxpn}

f(k)+f(n-k)是拆分,p0xpkxpn是合并

i<=k<j,假设在第k位置上找到最优解,则问题变成了两个子问题(Ai...Ak)(Ak+1...Aj)

用m[i][j]表示矩阵连乘的最优值,则初始状态为m[i,j](i=j),最终状态为m[1,n](i=1,j=n)

在这里插入图片描述

用s[i][j]记录断开位置

时间复杂度

p(n)=O(n^3)

代码实现

//重叠子问题的递归最优解

//A1 30*35 A2 35*15 A3 15*5 A4 5*10 A5 10*20 A6 20*25
//p[0-6]={30,35,15,5,10,20,25}
#include <iostream>
using namespace std;
int RecurMatrixChain(int i, int j, int **s, int *p); //递归求最优解
void Traceback(int i, int j, int **s); //构造最优解

int main() {
	int L = 7;
	int p[L] = {30, 35, 15, 5, 10, 20, 25};
	int **s = new int *[L];

	for (int i = 0; i < L; i++) {
		s[i] = new int[L];
	}

	cout << "矩阵的最少计算次数为:" << RecurMatrixChain(1, 6, s, p) << endl;
	cout << "矩阵最优计算次序为:" << endl;
	Traceback(1, 6, s);
	return 0;
}

int RecurMatrixChain(int i, int j, int **s, int *p) {
	if (i == j)
		return 0;

	int u = RecurMatrixChain(i, i, s, p) + RecurMatrixChain(i + 1, j, s, p) + p[i - 1] * p[i] * p[j];
	s[i][j] = i;

	for (int k = i + 1; k < j; k++) {
		int t = RecurMatrixChain(i, k, s, p) + RecurMatrixChain(k + 1, j, s, p) + p[i - 1] * p[k] * p[j];

		if (t < u) {
			u = t;
			s[i][j] = k;
		}
	}

	return u;
}



void Traceback(int i, int j, int **s) {
	if (i == j)
		return;

	Traceback(i, s[i][j], s);
	Traceback(s[i][j] + 1, j, s);
	printf("Multiply (A%d and A%d),断开位置是:%d\n", i, j, s[i][j]);
}

执行结果

动态规划

基本思想

其基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解,经分解得到子问题往往不是互相独立的

举例

你知道两个1相加等于2,问你三个1相加你是拿前面的两个1相加的结果加上1呢,还是再用1+1+1,你肯定会用前面的那种方法对吧,这就是动态规划,(1+1)就是(1+1+1)的子问题,且并不是相互独立,你得到了(1+1)就好得到(1+1+1)了

👍+✏️+⭐️是对博主最大的鼓励与支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SVM分类】基于鸽群算法优化支持向量机SVM实现分类附matlab的代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

arduino 复习题

名词解释 中断 计算机运行过程中&#xff0c;出现某些意外情况需主机干预时&#xff0c;机器能自动停止正在运行的程序并转入处理新情况的程序&#xff0c;处理完毕后又返回原被暂停的程序继续运行 中断服务程序 用于 CPU 处理中断的程序 中断源 引起中断的原因&#xff0c;或…

【JVS低代码平台】如何实现与外部系统/内部代码直接对接?

JVS是开放性的低代码开发平台&#xff0c;为开发团队预留了多种对接的方式。我这里列举集中对接的模式。 用户对接&#xff08;统一登录/单点跳转&#xff09; 在日常的企业需求中&#xff0c;常常有这种情况。企业内部考勤打开都是通过钉钉或者企微的&#xff0c;那么希望我们…

Grasp Detection论文、代码汇总

文章目录2022End-to-end Trainable Deep Neural Network for Robotic Grasp Detection and Semantic Segmentation from RGB2019Antipodal Robotic Grasping using Generative Residual Convolutional Neural Network2022 End-to-end Trainable Deep Neural Network for Robot…

现代PCB生产工艺——加成法、减成法与半加成法

继续为朋友们分享关于PCB生产工艺的知识。 现代PCB生产工艺&#xff0c;目前主要分为&#xff1a;加成法、减成法与半加成法。 其具体定义如下&#xff1a; 加成法&#xff1a; 通过网印或曝光形成图形&#xff0c;经钻孔、沉铜、转移层压等工艺加工&#xff0c;直接将导电图形…

Pycharm开发环境下创建python运行的虚拟环境(自动执行安装依赖包)

问题&#xff1a;基于Django开发的后台程序涉及到很多依赖的开发包&#xff0c;将该项目迁移到其它电脑环境下运行需要搭建环境&#xff0c;由于项目中有requirement.txt&#xff0c;该文件内包含了运行该项目所需的依赖&#xff1b;最简便的方式是执行命令自动安装requirement…

postgresql11 主从配置详解

以下内容是针对pgsql11来做的。请看好版本再去考虑是否往下看 准备两台服务器&#xff0c;地址如下&#xff1a; 主&#xff1a;192.168.0.1pgsql11从:192.168.0.2pgsql11一、主库配置 1、创建具有复制权限的用户replica 密码为000000 CREATE ROLE replica login replicat…

Docker——数据卷命令

目录 一、数据卷 1.1 便于修改 1.2 数据共享 1.3 安全问题 1.4 数据卷的基本语法 二、 创建数据卷&#xff0c;并查看数据卷在宿主机的目录位置 2.1 创建数据卷 2.2 查看所有数据卷 2.3 查看数据卷详细信息卷 2.4 删除数据卷 三、挂载数据卷 3.1 创建容器并挂载数据卷…

智慧国土解决方案-最新全套文件

智慧国土解决方案-最新全套文件一、建设背景二、建设思路1、紧盯三大领域2、划分三个阶段3、面向三个维度三、建设方案轻应用微服务大平台应用设计四、获取 - 智慧国土全套最新解决方案合集一、建设背景 2019年5月9日&#xff0c;印发《关于建立国土空间规划体系并监督实施的若…

Pandas 数据中的loc与iloc含义以及操作

本节学习并记录pandas 的DataFrame类型的数据是怎么对列或者行进行操作的 1、df.loc: 语法格式是df.loc[<行表达式>, <列表达式>]&#xff0c;如果列不传将返回所有的行&#xff0c;loc操作通过索引和列的条件筛选出数据。 2、df.iloc: 语法格式是df.iloc[<行…

python初级学习

第一章 为什么要学习Python 那些最好的程序员不是为了得到更高的薪水或者得到公众的仰慕而编程,他们只是觉得这是-件有 趣的事情。 ——Linux 之父 Linus TorvaIds 作为-个实用主义的学习者,最关心的问题-定是「我为什么要选择学 Python, 学会之后我可以用来做什么&#xff1…

基于springboot电动车智能充电服务平台设计与实现的源码+文档

摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括电动车智能充电服务平台的网络应用&#xff0c;在外国电动车智能充电服务平台已经是很普遍的方式&#xff0c;不过国内的电动车智能充电服务平台可能还处于起步阶段。电…

Briefings in bioinformatics2022 | 基于神经网络的分子性质预测通用优化策略

原文标题&#xff1a;A general optimization protocol for molecular property prediction using a deep learning network 代码&#xff1a;GitHub - titanda/Learn-it-all at ready_classification_feature 一、问题提出 虽然个别优化方法都成功地提高了模型的性能&#…

2022年IT服务行业研究报告

第一章 行业概况 IT服务是指在信息技术领域服务商为其用户提供信息咨询、软件升级、硬件维修等全方位的服务。IT服务产品包括&#xff1a;硬件集成、软件集成、通用解决方案、行业解决方案和IT综合服务。 服务过程是指IT需求得以满足的全过程&#xff0c;从IT服务商为用户提供…

小咖啡馆也能撬动大生意

在我们的传统观念里&#xff0c;无论什么行业&#xff0c;似乎店越大、生意也就越大&#xff0c;但事实真的如此吗&#xff1f;未必&#xff01;位于成都的原福咖啡馆整店大小仅10㎡&#xff0c;但在社区却人气非常高。从2018年开业至今&#xff0c;门店排队不断&#xff0c;而…

Pycharm初次创建项目时页面环境变量选择

Pycharm确实是一个非常不错的Python开发IDE&#xff0c;尤其对于初学者而言。 安装完Pycharm&#xff0c;并未创建任何工程项目时的界面&#xff0c;选择新建一个Pure Python项目&#xff0c; 基于上述界面解读 &#xff1a; 1是新建项目路径可以在Location处选择。 2是Proje…

MapReduce

4.1 MapReduce概述 2003年和2004年&#xff0c;Google公司在国际会议上分别发表了两篇关于Google分布式文件系统和MapReduce的论文&#xff0c;公布了Google的GFS和MapReduce的基本原理和主要设计思想。 4.1.1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架&#…

基于GIS的人口统计数据空间化解决方案

​ 人口数据一般以各种级别的行政区域为统计单位&#xff0c;使用表格进行展示。常用的人口分布度量指标是人口密度&#xff0c;即行政区域内单位土地面积上的人口数量&#xff0c;这种以行政辖区为单位进行统计的方法&#xff0c;统计的结果是假定人口均匀分布在整个区域内&a…

Flink的检查点和保存点

在分布式架构中&#xff0c;当某个节点出现故障&#xff0c;其他节点基本不受影响。这时只需要重启应用&#xff0c;恢复之前某个时间点的状态继续处理就可以了。这一切看似简单&#xff0c;可是在实时流处理中&#xff0c;我们不仅需要保证故障后能够重启继续运行&#xff0c;…

2023年系统规划与设计管理师-第二章信息技术知识

1. 软件工程 2. 面向对象 3. 开发模型 4. 开发方法 4.1 敏捷开发方法 4.2 RUP 5. 数据仓库和网络技术 5.1 网络七层结构 5.2 各设备位于哪一次 5.3 各层的协议 5.4 TCP分层 5.5 IPv6 VS IPv4 5.6 IPv4 &#xff1a;A类、B类、C类地址的划分 A类地址的第一组数字为1&#xff5…