当前位置: 首页 > news >正文

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

题目描述

  一个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博客

相关文章:

  • 清除conda和pip缓存的方法
  • STM32 基础知识(探索者开发板)--103讲 通用定时器
  • MACBOOK 通过iterm2连接堡垒机跳转服务器
  • 【用unity实现100个游戏之19】制作一个3D传送门游戏,实现类似鬼打墙,迷宫,镜子,任意门效果
  • json转换(json与对象互转、json与list互转、JSONObject与Map互转)
  • SketchUp各版本安装指南
  • HackTheBox - Medium - Linux - Jupiter
  • Plantuml之对象图语法介绍(十九)
  • LeetCode 268. 丢失的数字
  • 二分查找——OJ题(一)
  • 计算机网络概述(下)——“计算机网络”
  • python之Selenium WebDriver安装与使用
  • vue实现H5拖拽可视化编辑器
  • 香橙派5plus从ssd启动Ubuntu
  • matlab列优先与高维矩阵重构
  • 【node学习】协程
  • canvas绘制圆角头像
  • centos安装java运行环境jdk+tomcat
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JAVA 学习IO流
  • js递归,无限分级树形折叠菜单
  • mysql外键的使用
  • Python - 闭包Closure
  • React组件设计模式(一)
  • Sass Day-01
  • XForms - 更强大的Form
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 简单易用的leetcode开发测试工具(npm)
  • 聊聊flink的TableFactory
  • 异常机制详解
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • #100天计划# 2013年9月29日
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (pojstep1.3.1)1017(构造法模拟)
  • (定时器/计数器)中断系统(详解与使用)
  • (分布式缓存)Redis持久化
  • (五)Python 垃圾回收机制
  • (五)关系数据库标准语言SQL
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)大型网站的系统架构
  • (转载)从 Java 代码到 Java 堆
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .pop ----remove 删除
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [BZOJ] 2044: 三维导弹拦截
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [CISCN 2019华东南]Web11
  • [Contest20180313]灵大会议