Matrix Chain Multiple

2024-08-25 17:58
文章标签 multiple matrix chain

本文主要是介绍Matrix Chain Multiple,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

矩阵链乘
题意:
给定多个矩阵,相邻两个矩阵两两之间可以互乘。给出一个乘法的次序使得总的计算量最小。
例:
[2,3] [3,6] [6,4] [4,5]

我们可以使用括号表示先后顺序
((01)(23))
所以乘法的次数为:
2*3*6 +6*4*5 + 2*6*5 = 36 + 120 + 60 = 216
显然这样不是最优的,我们可以找出另一种乘法的方法
(((01)2)3)
2*3*6 + 2*6*4 + 2*4*5 = 36+48+40 = 124

给出一个具备乘法性质的n个矩阵【A[i].second == A[i+1].first】
问最小的乘法运算次数是多少。


这道题算是自己一点点推出来的。
首先通过样例我们可以联想到构建一个二维DP数组,使得dp[i][j]为i~j区间内相乘的最小数量。
我们知道单个矩阵是不需要做乘法所以dp[i][i]=0;
而i~j区间有可能经过拆分之后,获取到更小的值,所以我们令k且k>=i && k< j .
得到dp方程
dp[i][j]=min{

  • dp[i][j-1] + a[i].first*a[j].first*a[j].second
  • dp[i][k]+dp[k+1][j] + a[i].first * a[k+1].first*a[j].last k>i && k< j
    //update: 08-17 10:28
  • 两个其实可以被合并到一种情况的,因为第一种情况实际上是下面一种情况在k==j-1的情况下的特例
    }

也即下图
这里写图片描述

由于我们在推i~j的时候,可能会用到k+1~j而k+1显然是大于i的。
所以我们需要从后往前推。
这样才能保证求i~j的时候,i~k 和 k+1~j已经全部求出。

#include<stdio.h> 
#include<stdlib.h>
#include<string.h>
#include<vector>
#include<limits> 
#include<ctype.h>
#include<algorithm>
#define N 200
using namespace std;int dp[N][N];class Solution{
public:void getMinMatrixMulti(vector<pair<int,int> > &chain){int n=chain.size();//从后往前推 for(int i=n-1;i>=0;i--) {for(int j=i+1;j<n;j++){int min=INT_MAX;
//              for(int k=i+1;k<j;k++){
//                  if(dp[i][k]+dp[k+1][j]+chain[i].first*chain[k+1].first*chain[j].second<min)
//                  min=dp[i][k]+dp[k+1][j]+chain[i].first*chain[k+1].first*chain[j].second;
//              }
//              if(min> dp[i][j-1]+chain[i].first*chain[j].first*chain[j].second)
//              min = dp[i][j-1]+chain[i].first*chain[j].first*chain[j].second;for(int k=i;k<j;k++){if(dp[i][k]+dp[k+1][j]+chain[i].first*chain[k+1].first*chain[j].second<min)min=dp[i][k]+dp[k+1][j]+chain[i].first*chain[k+1].first*chain[j].second;}dp[i][j]=min;}}}
};int main(){vector<pair<int,int> > chain;chain.push_back(make_pair(2,3));chain.push_back(make_pair(3,6));chain.push_back(make_pair(6,4));chain.push_back(make_pair(4,5));memset(dp,0,sizeof(dp));Solution solution;solution.getMinMatrixMulti(chain);for(int i=0;i<chain.size();i++){for(int j=0;j<chain.size();j++){printf("%d ",dp[i][j]);}printf("\n");}printf("\n");printf("%d\n",dp[0][chain.size()-1]);system("pause");return 0;
}

这篇关于Matrix Chain Multiple的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106251

相关文章

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 大语言模型已被广泛采用,但推理时需要大量的GPU内存。我们开发了一种Int8矩阵乘法的过程,用于Transformer中的前馈和注意力投影层,这可以将推理所需

webservice系列3---chain

本节摘要:本节主要介绍webservice的高级特性chain的开发和配置 1.引言       之前在上webservice系列2---javabean&handler中讲了handler的使用,当有多个handler的时候,难道我们要一个一个的在wsdd文件中配置,然后一个一个的引入到需要的webservice中码?of course ,no。Apache组织已经替我们考虑到了这种需求,ch

73. Set Matrix Zeros

题目: 解答: 提供了两种解题思路: 第一种,使用两个数组,分别标记每一行、每一列是否有0的存在,然后再去更新二维数组。 第二种,使用两个变量brow,bcol分别标记第0行,第0列是否存在0,然后使用每一行、每一列的第一个单元存储是否该行、该列存在0. 代码: class Solution {public:// 方法一void setZeroes(vector<vector<i

Stripe data files across multiple physical devices and locations

Stripe data files across multiple physical devices and locations 如果在没有做条带的磁盘(即从存储到OS没有做raid),那么就需要手工去做I/O的分布。切记,不应该将频繁使用的table和其index分开,这样会正大I/O; 针对tables、indexes、temp tablespace,首先调优SQL,其次如果真心无法再

设计模式 -- 职责链模式(Chain of Responsibility Pattern)

1 问题引出 1.1 学校 OA 系统的采购审批项目 如果金额 小于等于 5000, 由教学主任审批 (0<=x<=5000)如果金额 小于等于 10000, 由院长审批 (5000<x<=10000)如果金额 小于等于 30000, 由副校长审批 (10000<x<=30000)如果金额 超过 30000 以上,有校长审批 ( 30000<x) 1.2 传统方式 传统方式是

Error: label vector and instance matrix must be double的解决方法

在使用uci下载的数据时,建模时出现这个错误的解决方法 首先现在UCI上面下载数据 然后右键另存为就行了。这样我们就从UCI里面下载到了训练数据 在matlab 点 导入数据,数据类型要记得选第二个, 如果选择最后一个table就会出现这个问题 最后附上代码 %%之前先import wine.date IMPORTED DATA 设为Numeric Matrix (数值矩

Flink 原理与实现:Operator Chain原理

硬刚大数据系列文章链接: 2021年从零到大数据专家的学习指南(全面升级版) 2021年从零到大数据专家面试篇之Hadoop/HDFS/Yarn篇 2021年从零到大数据专家面试篇之SparkSQL篇 2021年从零到大数据专家面试篇之消息队列篇 2021年从零到大数据专家面试篇之Spark篇 2021年从零到大数据专家面试篇之Hbase篇

Flink: 两个递归彻底搞懂operator chain

《2021年最新版大数据面试题全面开启更新》 operator chain是指将满足一定条件的operator 链在一起,放在同一个task里面执行,是Flink任务优化的一种方式,在同一个task里面的operator的数据传输变成函数调用关系,这种方式减少数据传输过程。常见的chain例如:source->map->filter,这样的任务链可以chain在一起,那么其内部是如何决定

python 实现matrix exponentiation矩阵求幂算法

matrix exponentiation矩阵求幂算法介绍 矩阵求幂算法(Matrix Exponentiation)是一种通过利用矩阵乘法的结合律来高效地计算矩阵的幂的算法。这种方法特别适用于在算法竞赛和计算机科学领域中解决需要快速计算矩阵幂的问题,如求解线性递推关系、图论中的路径计数等。 基本思想 矩阵求幂算法的基本思想类似于整数快速幂算法(快速幂算法),通过递归或迭代的方式将矩阵幂的计

[LeetCode] 240. Search a 2D Matrix II

题:https://leetcode.com/problems/search-a-2d-matrix-ii/description/ 题目 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers i