Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[动态规划] 矩阵链乘法问题

[动态规划] 矩阵链乘法问题

作者头像
racaljk
发布于 2018-08-31 03:04:34
发布于 2018-08-31 03:04:34
1.8K00
代码可运行
举报
文章被收录于专栏:racaljkracaljk
运行总次数:0
代码可运行

什么是矩阵链乘法(Matrix Chain Multiplication)

矩阵链乘法问题是指给定一串矩阵序列M₁M2..Mn,求至少需要进行多少次乘法运算才能求得结果

比如对于这个M₁M₂M₃的矩阵链, 

我们可以先计算M₁M₂然后结果乘以M₃,也可以M₂M₃先算,然后乘以M₁,为了表达方便,可以用括号表示计算顺序。 矩阵链M₁M₂M₃有两种计算顺序:((M₁M₂)M₃)和(M₁(M₂M₃))。 那么不同计算顺序有什么区别? 对于((M₁M₂)M₃): 

对于(M₁(M₂M₃)): 

我们要做的就是找到让乘法运算最少的计算顺序,换言之就是找一种加括号方式,使得最后乘法运算最少

状态转移方程

现用 optimal(M₁M₂) 表示M₁M₂最优计算成本 cost(M₁M₂) 表示M₁M₂计算成本optimal(M₁M₂)=optimal(M₁)+optimal(M₂)+cost(M₁M₂)

optimal(M₁)和optimal(M₂)均为零;同理

optimal(M₂M₃)=optimal(M₂)+optimal(M₃)+cost(M₂M₃)

(M₁M₂M₃)有两种加括号方式, 它的最优计算成本是这两种加括号方式中最优的那个,即:optimal(M₁M₂M₃)=min{optimal((M₁M₂)M₃),optimal(M₁(M₂M₃))}

显然,这里说的正是动态规划思想:我们从局部最优解出发,逐渐构造出大问题(同时局部最优解还有重叠,可以保存计算结果免去后面计算)。状态方程已经构造出来了,下面就是实际的实现

实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <algorithm>
#include <climits>

int dp[1024][1024] = { 0 };

struct Matrix {
    int row;
    int column;
};

int matrixChainCost(Matrix *ms, int n) {
    for (int scale = 2; scale <= n; scale++) {
        for (int i = 0; i <= n - scale; i++) {
            int j = i + scale - 1;
            dp[i][j] = INT_MAX;
            for (int k = i; k < j; k++) {
                dp[i][j] = std::min(dp[i][j], dp[i][k] + dp[k+1][j] + (ms[i].row*ms[k].column*ms[j].column));
            }
        }
    }
    return dp[0][n - 1];
}

int main() {
    int n;
    std::cin >> n;  //n个矩阵组成的矩阵链
    Matrix *ms = new Matrix[n];
    for (int i = 0; i<n; i++) {
        std::cin >> ms[i].row;      //第i个矩阵的行数
        std::cin >> ms[i].column;   //第i个矩阵的列数
    }
    std::cout << matrixChainCost(ms, n);
    system("pause");
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
文心一言 VS 讯飞星火 VS chatgpt (199)-- 算法导论15.2 1题
在Go语言中,为了找到矩阵链乘法的最优括号化方案,我们通常会使用动态规划(Dynamic Programming, DP)的方法。矩阵链乘法的问题是要确定计算矩阵乘积的最有效顺序,以最小化乘法操作的次数。
福大大架构师每日一题
2024/02/28
1940
文心一言 VS 讯飞星火 VS chatgpt (199)-- 算法导论15.2 1题
文心一言 VS 讯飞星火 VS chatgpt (200)-- 算法导论15.2 4题
矩阵链乘法问题是一个经典的动态规划问题,其中给定一个矩阵链,我们需要确定一个乘法顺序,使得计算该链所需的总标量乘法次数最少。
福大大架构师每日一题
2024/02/28
1760
文心一言 VS 讯飞星火 VS chatgpt (200)-- 算法导论15.2 4题
常见动态规划的解决思路
给定一个词的集合words,使用badness(i,j)表示使用的单词是words[i,j]
爬蜥
2019/07/09
4330
【算法】动态规划
_小羊_
2025/03/14
680
【算法】动态规划
文心一言 VS 讯飞星火 VS chatgpt (204)-- 算法导论15.3 3题
首先,我们要明确矩阵链乘法问题的原始形式:给定一个矩阵链 ( A_1, A_2, \ldots, A_n ),我们要找到一种括号化方案,使得乘法运算的次数最少。这个问题确实具有最优子结构性质,并可以使用动态规划来解决。
福大大架构师每日一题
2024/03/06
1600
文心一言 VS 讯飞星火 VS chatgpt (204)-- 算法导论15.3 3题
【算法统治世界】动态规划 个人笔记总结
动态规划可以被视为一种有限状态自动机,其中每个状态代表了问题的一个子集,状态之间的转移代表了子问题之间的关联。在有向无环图(Directed Acyclic Graph,简称DAG)中,每个节点代表一个状态,而边则代表了状态之间的转移关系。通过这种方式,动态规划将问题转化为在一个DAG上寻找最优路径的问题。
苏泽
2024/04/10
1170
【算法统治世界】动态规划 个人笔记总结
动态规划算法举例解析(最大收益和最小损失选择)
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
张凝可
2019/08/21
1.7K0
对于"矩阵连乘问题"的一点想法
在算法设计的学习中,每到“动态规划”一节,一般都会涉及到“矩阵连乘”问题(例如《Algorithms》,中文译名《算法概论》),可想而知该题的经典程度 :)
用户2615200
2018/08/02
9520
算法基础-动态规划
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。
她的店里只卖樱花
2022/10/31
4800
算法基础-动态规划
动态规划(详解矩阵连乘 案例+Java代码实现)
@toc 动态规划 History does not occur again 算法总体思想 与分治算法类似 子问题往往不是互相独立的, (分治会重复计算) 保存已解决的子问题的答案,需要时找出即可(空间换时间) 基本步骤 找出最优解的性质并刻划其结构特征 递归地定义最优值 以自底向上的方式计算出最优值(递推) 根据计算最优值时得到的信息构造最优解 矩阵连乘问题 问题描述 给定n个矩阵{A<sub>1</sub>, A<sub>2</sub>,..., A<sub>n</sub>}, 其中A<sub>i</s
ruochen
2021/05/14
1.3K0
动态规划(详解矩阵连乘 案例+Java代码实现)
矩阵链乘——动态规划初探讨
给定n个矩阵链<A1,A2,...,An>,矩阵Ai的规模为pi-1*pi(1≤i≤n),求完全括号化方案,使得A1A2,...An所需标量乘法次数最小。
天道Vax的时间宝藏
2021/08/11
3850
动态规划-区间DP
文章目录 区间DP 四边形不等式优化 例题 石子合并 回文串 区间DP image.png //朴素DP参考 for (int i = 1; i <= n; i++)dp[i][i]=0; for (int len = 1; len <= n; len++){ //枚举区间长度 for (int i = 1; i <= n - len; i++){ //枚举区间的起点 int j = i + len; //根据起点和长度得出终点 for(int k = i; k
唔仄lo咚锵
2020/09/15
4400
POJ-1179 Polygon (动态规划)
Polygon Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5293 Accepted: 2238 Description Polygon is a game for one player that starts on a polygon with N vertices, like the one in Figure 1, where N=4. Each vertex is labelled with a
ShenduCC
2018/04/25
6710
【经典DP】三步问题 / 整数拆分 / 不同路径II / 过河卒 / 下降路径最小和 / 地下城游戏
动态规划通过将问题分解为子问题并存储子问题的解(由记忆化搜索延伸)来避免重复计算。动态规划的关键就是状态和转移。
_小羊_
2025/04/09
680
【经典DP】三步问题 / 整数拆分 / 不同路径II / 过河卒 / 下降路径最小和 / 地下城游戏
动态规划专题——背包模型
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。
浪漫主义狗
2022/09/19
1.1K0
「算法小记」-2:矩阵链相乘的方案数【迭代/递归/动态规划/区域化DP/记忆化搜索】(C++ )
如果说简单的理解这个算法,我们可以打一段输出来检测每一次处理的dp数组的具体数值。
程序员洲洲
2024/06/07
1500
「算法小记」-2:矩阵链相乘的方案数【迭代/递归/动态规划/区域化DP/记忆化搜索】(C++ )
动态规划:解决复杂问题的高效策略
动态规划是一种自底向上的算法设计方法,用于解决具有重叠子问题和最优子结构的优化问题。它的核心思想是将一个复杂问题分解为多个相互关联的子问题,通过求解这些子问题并存储其解,最终构建出原问题的最优解。
用户11396661
2025/02/16
1100
动态规划--Kin
动态规划: 1.最大子序列和 2.LIS最长递增子序列 3.LCS最长公共子序列 4.矩阵连乘 5.数字金字塔 1.最大子序列和 #include<iostream> using namespace std; int maxsub(int a[],int n) { int sum=0,b=0; for(int i=0;i<=n;i++) { if(b>0) b+=a[i]; else b=a[i]; if(b>sum) sum=b; } return s
Kindear
2018/05/09
5440
(粗糙的笔记)动态规划
构造备忘录P[i,c],P[i,c]表示在前i个商品中选择,背包容量为c时的最优解
WuShF
2023/10/05
2830
(粗糙的笔记)动态规划
运筹学中的经典动态规划
应我们大大老板的要求,小小编今天打算给大家带来一些在运筹学中比较基础的动态规划问题,也算在之前的小舟小编的基础上加一些东西吧!
短短的路走走停停
2019/12/04
9140
相关推荐
文心一言 VS 讯飞星火 VS chatgpt (199)-- 算法导论15.2 1题
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验