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

矩阵链乘法【东北大学oj数据结构10-2】C++

矩阵链乘法问题的目标是找到最有效的方法来乘以给定的 n 个矩阵 M1,M2,M3,...,Mn。
编写一个程序,读取 Mi 的维度,并找到最小标量乘法以计算最大链链乘法 M1M2...Mn。

输入
在第一行中,给出了一个整数 n。 在接下来的 n 行中,矩阵 Mi (i=1...n) 的维度由两个整数 r 和 c 给出,分别表示 Mi 的行数和列数。

输出
在一行中打印最小数量的标量乘法。

约束
1≤n≤100
1≤r,c≤100

输入样例

6
30 35
35 15
15 5
5 10
10 20
20 25

输出样例

 15125

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n;
    cin >> n;
    //matrices直接存储一对数据
    vector<pair<int, int>> matrices(n);
    for (int i = 0; i < n; ++i) {
        cin >> matrices[i].first >> matrices[i].second;
    }

    // 二维数组dp[i][j] 表示计算矩阵 Mi...Mj 所需的最小乘法次数
    vector<vector<int>> dp(n, vector<int>(n, 0));
    for (int i = 0; i < n; ++i) {
        dp[i][i] = 0;
    }

    //计算维度为 m x n 的矩阵 A 和 n x p 的矩阵 B 的乘积,需要 m * n * p 次标量乘法
    //矩阵A (Mi 到 Mk 的乘积) 的维度
    //行数等于 Mi 的行数 (ri-1,用 matrices[i].first 表示)
    //列数等于 Mk 的列数 (ck,用 matrices[k].second 表示)
    //矩阵A的维度为 matrices[i].first x matrices[k].second

    //矩阵B (Mk+1 到 Mj 的乘积) 的维度
    //行数等于 Mk+1 的行数,但由于矩阵是链式相乘,Mk+1的行数会等于Mk的列数
    //因此Mk+1的行数等于ck,即matrices[k].second
    //列数等于 Mj 的列数 (cj,用 matrices[j].second 表示)
    //矩阵B的维度为matrices[k].second x matrices[j].second
    for (int len = 2; len <= n; ++len) {
        for (int i = 0; i <= n - len; ++i) {
            int j = i + len - 1;
            dp[i][j] = 1e9; // 初始化为一个很大的值
            //循环遍历可能的分割点 k
            for (int k = i; k < j; ++k) {
                int cost = dp[i][k] + dp[k + 1][j] +
                           matrices[i].first * matrices[k].second * matrices[j].second;
                dp[i][j] = min(dp[i][j], cost);
            }
        }
    }


    cout << dp[0][n - 1] << endl;

    return 0;
}

 


http://www.kler.cn/a/452615.html

相关文章:

  • 基于OpenCV和Python的人脸识别系统_django
  • 05.HTTPS的实现原理-HTTPS的握手流程(TLS1.2)
  • Websocket客户端从Openai Realtime api Sever只收到部分数据问题分析
  • LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测
  • 2021-04-08 VSC++: 降序折半查找。
  • 宠物行业的出路:在爱与陪伴中寻找增长新机遇
  • GitLab的卸载与重装
  • 信息安全管理与评估赛题第10套
  • Windows 远程桌面连接Ubuntu Desktop
  • 以下matlab文件因包含语法错误而未添加
  • 2023年厦门市第30届小学生C++信息学竞赛复赛上机操作题(三、2023C. 太空旅行(travel))
  • js创建对象的方式
  • 【网络安全零基础入门】PHP环境搭建、安装Apache、安装与配置MySQL(非常详细)零基础入门到精通,收藏这一篇就够(01)_php安装配置教程
  • 前端跨域问题--解析与实战
  • springboot整合Elasticsearch介绍
  • 【C++】优先级队列以及仿函数
  • python Redis 操作工具类封装
  • 48页PPT|2024智慧仓储解决方案解读
  • Kubernetes对象-标签和选择器
  • ubuntu22.04上安装win10虚拟机,并采用noVNC+frp,让远程通过web访问桌面
  • 电脑丢失bcrypt.dll文件是什么原因?找不到bcrypt.dll文件修复办法来啦!
  • Java技术专家视角解读:SQL优化与批处理在大数据处理中的应用及原理
  • CSS(一):选择器
  • LeetCode 热题 100_LRU 缓存(35_146_中等_C++)(哈希表 + 双向链表)(构造函数声明+初始化列表=进行变量初始化和赋值)
  • 【贪心】力扣3218. 切蛋糕的最小总开销 I
  • 分布式通信,微服务协调组件,zookeeper