动态规划之矩阵连乘问题C++版

这篇具有很好参考价值的文章主要介绍了动态规划之矩阵连乘问题C++版。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

算法总体思想

        动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题

矩阵连乘问题的动态规划算法c++,C/C++,c++,算法,动态规划        但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。 矩阵连乘问题的动态规划算法c++,C/C++,c++,算法,动态规划

        如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。

矩阵连乘问题的动态规划算法c++,C/C++,c++,算法,动态规划

动态规划基本步骤

  • 找出最优解的性质,并刻划其结构特征。
  • 递归地定义最优值。
  • 以自底向上的方式计算出最优值。
  • 根据计算最优值时得到的信息,构造最优解。

 矩阵连乘问题

矩阵连乘问题的动态规划算法c++,C/C++,c++,算法,动态规划 矩阵连乘问题的动态规划算法c++,C/C++,c++,算法,动态规划 矩阵连乘问题的动态规划算法c++,C/C++,c++,算法,动态规划

 完全加括号的矩阵连乘积可递归地定义为:

(1)单个矩阵是完全加括号的;

(2)矩阵连乘积X是完全加括号的,则X可表示为2个完全加括号的矩阵连乘积, 即Y和Z的乘积并加括号,即X=(YZ),Y和Z也是完全加括号的。

        给定n个矩阵 {A1,A2,、、、An} ,其中Ai与 Ai+1是可乘的,i=1,2,、、、n-1。考察这n个矩阵的连乘积 A1A2、、、An。         

        由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。

        如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。

穷举法:

        列举出所有可能的计算次序,并计算出每一种计算次序相应需要的数乘次数,从中找出一种数乘次数最少的计算次序。  

算法复杂度分析:

        对于n个矩阵的连乘积,设其不同的计算次序为P(n)。

        由于每种加括号方式都可以分解为两个子矩阵的加括号问题:(A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下

矩阵连乘问题的动态规划算法c++,C/C++,c++,算法,动态规划矩阵连乘问题的动态规划算法c++,C/C++,c++,算法,动态规划

穷举法:计算量非常大,这种方案不可行
动态规划

(1)首先分析最优解的结构

将矩阵连乘AiAi+1、、、Aj 简记为A[i:j] ,这里i≤j考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,i≤k<j,则其相应完全加括号方式为

(AiAi+1A、、、Ak)(Ak+1Ak+2、、、Aj)

计算量:A[i:k]的计算量加上A[k+1:j]的计算量,再加上A[i:k]和A[k+1:j]相乘的计算量 矩阵连乘问题的动态规划算法c++,C/C++,c++,算法,动态规划

(2)建立递归关系

        设计算A[i:j],1≤i≤j≤n,所需的最少数乘次数m[i,j],则原问题的最优值为m[1,n].

矩阵连乘问题的动态规划算法c++,C/C++,c++,算法,动态规划 矩阵连乘问题的动态规划算法c++,C/C++,c++,算法,动态规划

(3)以自底向上的方式求最优值

对于1≤i≤j≤n不同的有序对(i,j)对应于不同的子问题。因此,不同子问题的个数共有:  矩阵连乘问题的动态规划算法c++,C/C++,c++,算法,动态规划
在递归计算时,许多子问题被重复计算多次。这也是该问题可用动态规划算法求解的又一显著特征
用动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算。
在计算过程中,保存已解决的子问题答案。每个子问题只计算一次,需要时只要查一下子问题的结果,避免大量的重复计算,最终得到多项式时间的算法。
 

 用动态规划法求最优值

void MatrixChain(int *p,int n,int **m,int **s){
        for (int i = 1; i <= n; i++) m[i][i] = 0;
        for (int r = 2; r <= n; r++)
           for (int i = 1; i <= n - r+1; i++) {
              int j=i+r-1;
              m[i][j] = m[i][i]+m[i+1][j]+ p[i-1]*p[i]*p[j];
              s[i][j] = i;
              for (int 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;}
              }
          }
}

算法复杂度分析:

        算法主要计算量取决于算法中子问题的数量,已知为O(n2),求每个子问题的最优值的时间复杂性O(n)(即k控制循环次数最大值),因此算法的计算时间上界为O(n3)。算法所占用的辅助空间显然为O(n2)。

矩阵连乘问题的动态规划算法c++,C/C++,c++,算法,动态规划 矩阵连乘问题的动态规划算法c++,C/C++,c++,算法,动态规划

(4)递归算法构造最优解

矩阵连乘问题的动态规划算法c++,C/C++,c++,算法,动态规划

 参考代码

#include<iostream>
#define N 20
using namespace std;
void MatrixChain(int p[N],int n,int m[N][N],int s[N][N]){
    int i,j,t,k;
    int r;
    for(i=1;i<=n;i++){
        m[i][i]=0;
    }
    for(r=2;r<=n;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];
            s[i][j]=i;
            for(k=i+1;k<j;k++){
                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;
                }
            }
        }
    }
}
void Traceback(int i,int j, int s[][N]){
    if(i==j)
    {
        cout<<"A"<<i;
    }
    else
    {
        cout<<"(";
        Traceback(i,s[i][j],s);
        Traceback(s[i][j]+1,j,s);
        cout<<")";
    }
}
int main(){
    int n,n1,m1,i,j=2;
    int p[N]={0};
    int m[N][N]={0};
    int s[N][N]={0};
    cout<<"Please enter the number of matrices:"<<endl;
    cin>>n;
    for(i=1;i<=n;i++){
        cout<<"Please enter No "<<i<<"Rows and columns of matrix (n1 m1 format):";
        cin>>n1>>m1;
        if(i==1){
            p[0]=n1;
            p[1]=m1;
        }
        else{
            p[j++]=m1;
        }
    }
    cout<<endl<<"Record matrix rows and columns:"<<endl;
    for(i=0;i<=n;i++){
        cout<<p[i]<<"\t";
    }
    cout<<endl;
    MatrixChain(p,n,m,s);
    cout<<endl<<"The minimum degree matrix of matrix multiplication is:"<<endl;
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            cout<<m[i][j]<<"\t";
        }
        cout<<endl;
    }
    cout<<endl<<"The position matrix of matrix multiplication disconnection is:"<<endl;
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            cout<<s[i][j]<<"\t";
        }
        cout<<endl;
    }
    cout<<endl<<"The minimum times of matrix multiplication are:\n"<<m[1][n]<<endl;
    cout<<endl;
    cout<<"Disconnected position:"<<endl;
    Traceback(1,n,s);
    return 0;
}

 文章来源地址https://www.toymoban.com/news/detail-792671.html

 

到了这里,关于动态规划之矩阵连乘问题C++版的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划:矩阵连乘问题,字节跳动今日学习内容

    分析: 二.问题分析 由于矩阵乘法满足结合律,所以计算矩阵连乘的连乘积可以与许多不同的计算计算次序,这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,也就是说连乘积已完全加括号,那么可以依此次序反复调用2个矩阵相乘的标准算法

    2024年04月11日
    浏览(55)
  • 动态规划:矩阵连乘问题(文末附有手写版例题)

    A是一个p × q矩阵,B是一个q × r矩阵,AB相乘,得到的矩阵元素个数为p × r,每个元素由q次乘法得到,因此所需乘法次数为p × q × r。 在计算矩阵连乘积时,加括号的方式对计算量有影响。 例如有三个矩阵A1,A2,Ag连乘,它们的维数分别为 10x100,100×5,5×50。用第一种加括号方

    2024年02月04日
    浏览(43)
  • 动态规划算法学习一:DP的重要知识点、矩阵连乘算法

    三部曲如下三步: 基本原则:“空间换时间” 存储重复子问题的解,减少运算时间 底层运算:“表格操作” 用表格存储子问题的解 实现路线:“子问题划分、自底向上求解” 利用表格中存储的子问题的解,求上一层子问题的解。 矩阵连乘计算次序 可以用 加括号的方式

    2024年02月09日
    浏览(41)
  • 『动态规划』矩阵连乘

    活动地址:CSDN21天学习挑战赛 👨‍🎓作者简介:一位喜欢写作,计科专业大三菜鸟 🏡个人主页:starry陆离 🕒首发日期:2022年8月16日星期二 🌌上期文章:『动态规划』动态规划概述 📚订阅专栏:『算法分析与设计』 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦

    2024年02月07日
    浏览(66)
  • 【动态规划】【 矩阵】【逆向思考】C++算法174地下城游戏

    视频算法专题 动态规划汇总 矩阵 逆向思考 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数

    2024年02月03日
    浏览(46)
  • 【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II

    视频算法专题 动态规划汇总 矩阵快速幂 滚动向量 【矩阵快速幂】封装类及测试用例及样例 可以用字符串表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符: ‘A’:Absent,缺勤 ‘L’:Late,迟到 ‘P’:

    2024年01月15日
    浏览(51)
  • C++算法 —— 动态规划(2)路径问题

    每一种算法都最好看完第一篇再去找要看的博客,因为这样会帮你梳理好思路,看接下来的博客也就更轻松了。当然,我也会尽量在写每一篇时都可以让不懂这个算法的人也能边看边理解。 动规的思路有五个步骤,且最好画图来理解细节,不要怕麻烦。当你开始画图,仔细阅

    2024年02月06日
    浏览(50)
  • C++算法初级11——01背包问题(动态规划2)

    辰辰采药 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时

    2024年02月02日
    浏览(50)
  • C++ DP算法,动态规划——背包问题(背包九讲)

    有N件物品和一个容量为 V V V 的背包。放入第i件物品耗费的空间是 C i C_i C i ​ ,得到的价值是 W i W_i W i ​ 。 求解将哪些物品装入背包可使价值总和最大。 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 用子问题定义状态:即 F [ i , v ] F[i, v] F

    2024年02月16日
    浏览(51)
  • 「算法小记」-2:矩阵链相乘的方案数【迭代/递归/动态规划/区域化DP/记忆化搜索】(C++ )

    😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:程序员洲洲。 🎈 本文专栏:本文收录于洲洲的《算法小记》系列专栏,该专栏记录了许

    2024年02月05日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包