算法设计与分析 | 矩阵连乘

题目描述

  一个n*m矩阵由n行m列共n*m个数排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个N*M的矩阵乘以一个M*P的矩阵等于一个N*P的矩阵,运算量为nmp。
  矩阵乘法满足结合律,A*B*C可以表示成(A*B)*C或者是A*(B*C),两者的运算量却不同。例如当A=2*3 B=3*4 C=4*5时,(A*B)*C=64而A*(B*C)=90。显然第一种顺序节省运算量。
  现在给出N个矩阵,并输入N+1个数,第i个矩阵是a[i-1]*a[i]

输入

第一行n(n<=100)
第二行n+1个数

输出

  最优的运算量

样例输入 
3
2 3 4 5
样例输出 
64

分析:

其实该题使用了动态规划来选出最优子结构,并且使用了以下等式:

先初始化m数组和s数组,这里使用了C++的函数memset():

void* memset(void* s, int c, size_t n);

参数解释:
- `s`:指向要填充的内存区域的指针。
- `c`:要设置的字符值(实际上是将其转换为对应的ASCII码或字节值)。
- `n`:要填充的字节数。

`memset`函数将`s`指向的内存区域的前`n`个字节用`c`指定的值进行填充。返回值是原始的`s`指针。

并且m矩阵里面其实填充的是矩阵的右上角的部分,如可以看作下图这样:

代码:

//矩阵连乘
#include<iostream>
#include<cstring> 
using namespace std;
const int size = 101;
int p[size];
int m[size][size], s[size][size];
int n;void matrixchain()
{int i, r, j, k;memset(m, 0, sizeof(m));memset(s, 0, sizeof(s));//初始化数组for (r = 2; r <= n; r++)//矩阵连乘的规模为r {for (i = 1; i <= n - r + 1; i++){j = i + r - 1;m[i][j] = m[i + 1][j] + p[i - 1] * p[i] * p[j];//对m[][]开始赋值s[i][j] = i;//s[][]存储各子问题的决策点for (k = i + 1; k < j; k++)//寻找最优值{int 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()
{cin >> n;int i, j;for (i = 0; i <= n; i++)cin >> p[i];matrixchain();cout << m[1][n] << endl;return 0;
}

 参考博文:动态规划之——矩阵连乘(全网最详细博文,看这一篇就够了!)_矩阵连乘问题-CSDN博客

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

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

相关文章

linux安装maven3.8.8官网下载安装

步骤 1&#xff1a;下载 Maven 安装包 打开浏览器&#xff0c;访问 Maven 官方网站&#xff1a;https://maven.apache.org/download.cgi在页面上找到最新的稳定版本的 Maven&#xff0c;复制下载链接。 步骤 2&#xff1a;使用终端下载 Maven 安装包 打开终端&#xff0c;使…

什么是https证书?

HTTPS证书&#xff0c;也称为SSL&#xff08;Secure Sockets Layer&#xff09;证书或TLS&#xff08;Transport Layer Security&#xff09;证书&#xff0c;是一种数字证书&#xff0c;用于在网络上建立安全的加密连接。它的主要目的是确保在互联网上进行的数据传输的安全性和…

Linux空间不足处理

目录 临时处理 杀死没在使用的后台进程&#xff08;某些进程可能会占用几十个G的空间&#xff09; 手动释放空间 清理/tmp/ray目录 永久处理 将文件挪至空间充足的挂载盘 将软件挪至空间充足的挂载盘&#xff0c;在原目录创建软链接 临时处理 杀死没在使用的后台进程&a…

Android : 画布绘制矩形和文字 让其居中显示简单应用

示例图&#xff1a; CenterView.java package com.example.demo;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Log; import android.view.View;public class Center…

Android 12 Token 机制

一、前言 在 android framework 框架中 activity 和 window 是相互关联的&#xff0c;而他们的管理者 AMS 和 WMS 是怎么来实现这种关联关系的&#xff0c;答案就是通过 token。 首先大家需要了解一下 LayoutParams&#xff0c;当然属性很多&#xff0c;简单了解即可&#xf…

深入理解ArkTS:Harmony OS 应用开发语言 TypeScript 的基础语法和关键特性

文章目录 前言TypeScript语法变量声明条件控制循环迭代函数类和接口模块开发文章总结要点总结前言 Harmony OS应用开发的主力语言ArkTS的前身TS语言的基本语法。通过学习变量的声明和数据类型、条件控制、函数声明、循环迭代等基本知识,并了解内核接口的声明和使用。同时还介…

openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作示例

文章目录 openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作示例175.1 相同表的INSERT和DELETE并发175.2 相同表的并发INSERT175.3 相同表的并发UPDATE175.4 数据导入和查询的并发 openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入…

redis开启密码验证

开启密码验证 &#xff08;1&#xff09;配置文件中设置 redis.conf文件里面配置requirepass参数&#xff0c;redis认证密码&#xff1a;foobared&#xff0c;然后重启redis服务 ./redis-cli 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> CONFIG SET requi…

训练和测试的loss、accuracy等数据保存到文件并读出

首先是写文件到excel import os.path from openpyxl import load_workbook import pandas as pd import matplotlib.pyplot as pltdef write_excel(excel_name, sheet_name, value):columns ["epoc", "train_loss", "train_acc", "test_a…

跟着野火学FreeRTOS:第一段(任务延时列表)

既然是延时列表&#xff0c;那肯定要先定义相应的链表&#xff0c;延时列表的定义如下。这里定义了两条延时列表&#xff08;其实就是前面小节里面提到的链表的根节点&#xff09;&#xff0c;一条是准备当记录 S y s t i c k Systick Systick周期个数的变量 x T i c k C o u n…

idea Spring Boot项目使用JPA创建与数据库链接

1.pom.xml文件中添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>…

创建和配置Spring MVC框架构建Web应用

1 认识Spring MVC Spring Web MVC是构建在Servlet API之上的Web框架&#xff0c;自诞生之时就被纳入了Spring框架中。其正式/官方名称为“Spring Web MVC”&#xff0c;源自其所属的模块&#xff08;spring-webmvc&#xff09;&#xff0c;但通常被称为“Spring MVC”。 1.1…

最短路径(数据结构实训)(难度系数100)

最短路径 描述&#xff1a; 已知一个城市的交通路线&#xff0c;经常要求从某一点出发到各地方的最短路径。例如有如下交通图&#xff1a; 则从A出发到各点的最短路径分别为&#xff1a; B&#xff1a;0 C&#xff1a;10 D&#xff1a;50 E&#xff1a;30 F&#xff1a;60 输…

“暂存”校验逻辑探讨

1、背景 在业务中可能会遇到这种场景&#xff0c;前端页面元素多且复杂&#xff0c;一次性填完提交耗时很长&#xff0c;中间中断面临着丢失数据的风险。针对这个问题&#xff0c;“暂存”应运而生。 那“暂存”的时候&#xff0c;是否需要对数据校验&#xff0c;如何进行校验…

【全局光照GI系统剖析_Enlighten和Progressive Lightmapper_案例分享(附带场景下载链接)_场景】

烘焙预计算 前文:续_直接和间接光照这一篇小结:Unity烘焙预计算烘焙前的场景设置1.2.Contribute GI如下图:物体的Static和面板上的Contribute GILightmap的UV模型自带Lightmap的UVUnity 自动展Lightmap的UV1.3.Meta PassMeta Pass代码如下:1.4.Light Mode模式

k8s部署 CNI 网络组件与k8s集群搭建(二)

目录 部署 CNI 网络组件 部署 flannel K8S 中 Pod 网络通信 Flannel UDP 模式的工作原理 ETCD 之 Flannel 提供说明 Flannel VXLAN 模式跨主机的工作原理 在 node01 节点上操作 在 master01 节点上操作 部署 Calico k8s 组网方案对比 Calico 主要由三个部分组成 Ca…

go 源码解读 - sync.Mutex

sync.Mutex mutex简介mutex 方法源码标志位获取锁LocklockSlowUnlock怎么 调度 goroutineruntime 方法 mutex简介 mutex 是 一种实现互斥的同步原语。&#xff08;go-version 1.21&#xff09; &#xff08;还涉及到Go运行时的内部机制&#xff09;mutex 方法 Lock() 方法用于…

网盘项目话术(0.5w字精选)

功能结构图 数据库设计总结 该项目主要就是对文件的操作&#xff0c;file表&#xff0c;file_share表。 file表主要字段&#xff1a;id&#xff0c;用户id&#xff0c;父级目录id&#xff0c;文件的地址&#xff0c;文件的封面图片地址&#xff0c;创建和修改时间。 file_sha…

Java命令行最实用的命令

Java 命令行提供了许多重要且实用的命令&#xff0c;以下是其中一些常用的命令&#xff1a; java&#xff1a;用于运行 Java 程序的命令。使用 java 命令后面跟着要执行的 Java 类名。 java MyClassjavac&#xff1a;用于编译 Java 源代码文件的命令。使用 javac 命令后面跟着要…

vue中的事件绑定的过程

Vue中事件的绑定分为两种情况&#xff1a;原生DOM事件和组件事件。 原生DOM事件 是指在模板中使用v-on或指令来给元素绑定的事件&#xff0c;如 <button click"handler">click me</button>这种事件的绑定是通过以下步骤实现的&#xff1a; 模板编译阶…