动态规划矩阵连乘求最优值和最优解

7 篇文章 1 订阅
订阅专栏
  • 问题描述

矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数和第二个矩阵的行数相同时才有意义。给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。比如A1(10*100),A2(100*5),A3(5*50)三个矩阵,相乘次序分别为((A1*A2)A3)和(A1(A2*A3))时,矩阵相乘的次数分别为750010*100*5+10*5*50和75000(100*5*50+100*50*10),所以我们需要找到相乘次数最少的矩阵相乘次数(最优值)和矩阵相乘次序(最优解)。

  • 基本思路

递归公式

m[i][j]=m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j]

这里的i是第一个相乘矩阵的序列数,j是最后一个所乘的矩阵序列数,其中k是最后一次相乘时序列数i到j中间的任意一个断点数。

m[i][j]存放的是从第i个矩阵到第j个矩阵的矩阵连乘的计算次数

实例:

例:现在有六个矩阵相乘,分别是A1、A2、A3、A4、A5、A6,矩阵的行数和列数分别是A1(30,35)、A2(35,15)、A3(15,5)、A4(5,10)、A5(10,20)、A6(20,25),则六个矩阵相乘经过计算解得最优值为:15125,且最优解为(A1*(A2*A3))*((A4*A5)*A6)

笔算过程如下:

过程是分层运算的,只有1个矩阵时、有2个矩阵时、有三个矩阵时、、、

 

 

 全部代码如下:

#include<iostream>
using namespace std;

int p[100];
int m[100][100], s[100][100];
int n;
//寻找最优值和断点位置
void matrixchain()
{
    int i, r, j, k;

    //初始化数组
    for (i = 0; i < 100; i++)
    {
        for (j = 0; j < 100; j++)
        {
            m[i][j] = 0;
            s[i][j] = 0;
        }

    }

    for (r = 2; r <= n; r++)//矩阵连乘的规模为r,此时计算的矩阵连乘的个数是r个且是顺序连续并所有的。从2开始,因为只有一个矩阵相乘的次数为0。
    {
        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[i][i]为0,先对m[i][j]赋一个在该位置(第一个断点位置)相连乘的值
            s[i][j] = i;//s[][]存储各子问题的决策点,前面m里面存的是在第一个断点位置的值,所以这里存1
            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;//将最优值赋给m
                    s[i][j] = k;//记录断点位置
                }
            }
        }
    }
}
//寻找最优解
void print(int i, int j)
{
    if (i == j)
    {
        cout << "A[" << i << "]";
        return;
    }

    cout << "(";
    print(i, s[i][j]);
    cout << "*";
    print(s[i][j] + 1, j);
    cout << ")";
}

int main()
{
    cout << "请输入矩阵的个数n : " << endl;
    cin >> n;
    int i, j;
    cout << "请依次输入每个矩阵的行数和最后一个矩阵的列数:" << endl;
    for (i = 0; i <= n; i++)
        cin >> p[i];//将第一个矩阵的列和第二个矩阵的行的下标置为相同的了
    matrixchain();
    cout << "最优值为:" << m[1][n] << endl;
    cout << "最优解计算方法为:";
    print(1, n);
    cout << endl;
    return 0;
}

结果如图:

 

动态规划矩阵连乘最优
04-02
在计算机科学与算法设计领域中,矩阵链乘问题是指如何通过合理的排列方式来最小化矩阵连乘操作中的计算成本。这个问题之所以存在,是因为矩阵乘法并不满足交换律(即\(AB \neq BA\)),但是它满足结合律(即\((AB)C ...
[ACM_SMU_1104]最优矩阵连乘
tansitongba
05-24 688
最优矩阵连乘积 Accepted: 10 Total Submit: 18 Time Limit: 1000ms Memony Limit: 32768KB Description 在科学计算中经常要计算矩阵的乘积。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵。其标准计算公式为: ...
矩阵连乘 最优计算次序 动态规划 图文详解
qq_45750017的博客
07-05 8973
#include <bits/stdc++.h> using namespace std; //相乘的矩阵个数为(num-1)个 #define num 5 //col[0]存的是第一个矩阵的行数,其余分别为第1、第2...第num个矩阵的列数 //只存列数是因为两个矩阵可以运算的前提是:前一个矩阵的 列数 等于后一个矩阵的 行数。所以如果想取当前矩阵的 行数,只需要查矩阵的 列数 即可。 //例如A1.shape=(30,35),A2.shape=(35,15),此时A1列数等于A2行数,所
动态规划篇(1)---矩阵连乘问题的最优解
最新发布
weixin_63444513的博客
05-06 839
动态规划的经典题------矩阵乘法问题的两种解法:递归与非递归法
算法笔记——3动态规划
星辰的博客
01-10 1239
动态规划 动态规划自下而上解决问题,每个子问题都必须解。 动态规划的两个特性: 1、子问题不相互独立。 2、具有最优子结构性。 典型问题: 1、矩阵连乘 2、最长公共子序列 3、图像压缩 4、流水作业调度 5、0-1背包 ...
矩阵连乘问题——算法笔记——详解
热门推荐
weixin_44023658的博客
04-24 2万+
1、动态规划法 问题简述: 给定n个矩阵{A1A2…An},其中Ai和Ai+1是可乘的,考察这n个矩阵的连乘积A1A2…An。由于矩阵的乘法满足结合律,故计算矩阵的连乘积有许多不同的计算次序,而不同的计算次序,所需要计算的连乘次数也是不同的,解连乘次数最少的矩阵连乘最优次序。 举例说明矩阵结合方式对数乘次数的影响: 矩阵连乘积A1A2A3,3个矩阵的维数分别为10x100,100x5和5x50,...
Java矩阵连乘问题(动态规划)算法实例分析
08-28
Java矩阵连乘问题(动态规划)算法实例分析 本文主要介绍了Java矩阵连乘问题的动态规划算法实例分析。矩阵连乘问题是指给定n个矩阵,确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 ...
动态规划矩阵连乘问题Python实现方法
09-21
总的来说,动态规划矩阵连乘问题的Python实现涉及到矩阵运算、动态规划理论和递归回溯等计算机科学中的基本概念。通过对子问题的分解和组合,我们可以有效地到解决复杂问题的最优策略。这种思想在很多其他领域,...
动态规划解决矩阵连乘问题
03-21
掌握动态规划算法的基本步骤:最优解的性质,并刻画其结构特征;递归地定义最优;以自底向上的方式计算出最优;根据计算最优时得到的信息,构造最优解。 熟悉矩阵连乘算法,设计一个动态规划算法解决。 ...
矩阵连乘问题(动态规划)报告.doc
12-26
矩阵连乘问题】是一种经典的动态规划应用,主要目的是到一系列矩阵相乘的最优顺序,以使得乘法操作的次数最小。这个问题的关键在于利用最优子结构的性质,即解决大问题的最优解包含了子问题的最优解。 1. **...
矩阵连乘最优次序 c++实现 动态规划算法
longzuo
05-25 1669
#include const int N=4; namespace recursion {  /*p数组存储比从start到end再多一个的数, 代表着m[start][end]*/ int matrixChain(const int *p,int start,int end) {    if(start>=end)return 0;    int min=65536;
动态规划算法——矩阵乘法的顺序安排
龙之吻的专栏
05-26 4201
动态是解决递归过程的大量冗余计算的缺点,其采用把子问题的答案系统的记录在一个表中,当计算后面的问题是用到前面的结果可以直接到表中查,而无需再递归重新计算。     比如:斐波那契数是一个常见的递归计算过程,采用递归算法程序效率非常低。递归算法是模仿递归过程的,计算F(n),存在一个对F(n-1)和F(n-2)的调用,解F(n-1),要对F(n-2)、F(n-3)的调用,存在2次对F(n-2)
矩阵连乘最优与构造最优解——呕心沥血篇
少年白马
04-20 7153
矩阵连乘—详细讲解 初次接触dp,就看到很多位大佬给出自己的见解,dp算是最难的算法之一吧,主要在于灵活度高,需要自己推出动态规划方程 100个动态规划方程传送门 涉及到dp问题那么for循环一般从1开始遍历,这样会好些,虽然目前的我还没理解,但是看到许多大佬写代码都是从1开始遍历,那我也慢慢的改变。 下面我就几个问题来说明一下矩阵连乘问题 矩阵连乘问题-最优 题目描述 使用动态规划算法...
动态规划法及其优化
m0_56318237的博客
03-24 1734
数据量较大的多重背包的优化问题
常用算法大全-动态规划算法
不再犹豫
05-27 3220
常用算法大全-动态规划算法 作者:       类别: 程序员 function doZoom(size){var zoom=document.all?document.all[Zoom]:document.getElementById(Zoom);zoom.style.fontSize=size+px;}字体大小: 小
算法】-动态规划
化身孤岛的鲸
05-12 295
动态规划算法与分治法类似,其基本思想也是将待解问题分解成若干个子问题,先解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合用动态规划解的问题,经分解得到的子问题往往不是独立的。若用分治法来解这类问题,则相同的子问题会被解多次,以至于最后解决原问题需要耗费指数级时间。然而,不同子问题的数目常常只有多项式量级。如果能够保存已解决的子问题的答案,在需要时再出已得的答案,这...
矩阵导方法&最小二乘最优解解过程
路过的小阳仔
11-21 6646
一、 矩阵导方法 1. 对于映射f:ℜm∗n↦ℜf:\Re^{m*n} \mapsto \Re,即将m∗nm * n的矩阵AA映射为实数f(A)f(A),则函数ff关于AA的偏导为: ∇Af(A)=⎡⎣⎢⎢⎢⎢⎢∂f∂A11⋮∂f∂Am1⋯⋱⋯∂f∂A1n⋮∂f∂Amn⎤⎦⎥⎥⎥⎥⎥ \nabla_Af(A) = \left[ \begin{matrix} \frac{\partial
矩阵连乘积问题--动态规划
m0_63064861的博客
03-16 2003
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2,…n-1。考察这n个矩阵的连乘积A1A2…An。
动态规划矩阵连乘
weixin_53522240的博客
01-09 1万+
基本思想 动态规划算法与分治法类似,其基本思想是将待解的问题分解成若干子问题,先解子问题,再结合子问题的解得到原问题的解。与分治法不同的是,适合用动态规划解的问题经分解解的子问题往往不是相互独立的。 若用分治法来解这类问题,则分解得到的子问题数目太多,以致最后解决原问题需要耗费指数级时间。然而,不同子问题的数目常常只有多项式量级。在用分治法解时,有些子问斯被重复计算了许多次。如果能够保存已解决的子问题的答案,在需要时再出已得的答案,这样可以避免大量的重复计算,从而得到多项式时间算法。为了达到
写文章

热门文章

  • 动态规划矩阵连乘求最优值和最优解 4154
  • 0-1背包--回溯法求最优值和最优解问题 2592
  • 0-1背包问题--动态规划法求最优解和最优值 1359
  • 最长公共子序列求最优值和最优解递归算法 1214
  • 二分查找(折半查找)递归算法 287

分类专栏

  • 算法设计与分析 7篇

最新评论

  • 动态规划矩阵连乘求最优值和最优解

    2301_81787030: i<=n和i<=n-r+1都能成功运行呢

  • 动态规划矩阵连乘求最优值和最优解

    @碧血但马马: 可以的 懂了表情包表情包

大家在看

  • Java | Leetcode Java题解之第350题两个数组的交集II
  • C++ | Leetcode C++题解之第350题两个数组的交集II
  • C++ | Leetcode C++题解之第352题将数据流变为多个不想交区间
  • 【MySQL 07】表的增删查改 (带思维导图) 734
  • 基于麻雀算法优化的二维otsu图像分割 561

最新文章

  • 数字三角形--动态规划法
  • 0-1背包--回溯法求最优值和最优解问题
  • 0-1背包问题--动态规划法求最优解和最优值
2022年7篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码荷坳网站建设设计沙井网站关键词优化南山外贸网站设计塘坑阿里店铺运营龙华百度seo塘坑百搜标王广州seo吉祥网站设计模板龙华外贸网站建设深圳网站优化按天收费横岗建设网站广州企业网站制作石岩百搜标王南山网站优化软件宝安网页制作福永企业网站设计横岗品牌网站设计横岗seo排名大芬品牌网站设计双龙优化民治网页设计光明网络营销双龙企业网站改版广州关键词按天计费平湖SEO按天计费坪地SEO按天扣费南联百搜标王丹竹头百姓网标王横岗网站设计大芬百姓网标王歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化