矩阵连乘问题(c++)

矩阵连乘问题
问题描述:
给定n个矩阵:A1,A2,…,An,其中Ai与Ai+1是可乘的,i=1,2…,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和每个矩阵规模,输出结果为计算矩阵连乘积的计算次序和最少数乘次数。
问题分析:
1.分析最优解的结构
设计求解具体问题的动态规划算法的第一步是刻画该问题的最优解的结构特征。我们将矩阵连乘积AiAi+1…Aj简记为A[ i : j ]。考察计算A[ 1: n]的最优计算次序。设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,1<=k<n,则其相应的完全加括号形式为((A1…Ak)(Ak+1…An))。以此次序,总的计算量为A[ 1 : k ]的计算量加上A[ k+1 : n ]的计算量, 再加上A[ 1 : k ]和A[ k+1 : n ]相称的计算量。
这个问题的关键特征是:计算A[ 1 :n ]的最优次序所包含的计算矩阵子链a[ 1 : k ]和A[ k+1 : n ]的次序也是最优的。因此,矩阵连乘积计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。问题的最优子结构性质是该问题可以用动态规划算法求解的显著特征。

2.建立递归关系

从连乘矩阵个数为2开始计算每次的最小乘次数m[i][j]: m[0][1] m[1][2] m[2][3] m[3][4] m[4][5] //m[0][1]表示第一个矩阵与第二个矩阵的最小乘次数

然后再计算再依次计算连乘矩阵个数为3:m[0][2] m[1][3] m[2][4] m[3][5]

连乘矩阵个数为4:m[0][3] m[1][4] m[2][5]

连乘矩阵个数为5:m[0][4] m[1][5]

连乘矩阵个数为6:m[0][5] //即最后我们要的结果
          在这里插入图片描述

m[i][j]给出了最优值,即计算A[i:j]所需的最少数乘次数。同时还确定了计算A[i:j]的最优次序中的断开位置k,也就是说,对于这个k有m[i][j]=m[i[k]+m[k+1][j] + Pi-1*Pk*Pj

若将对应于m[i][j]的断开位置k记为s[i][j],在计算最优值m[i][j]后,可以递归地有s[i][j]构造出相应的最优解。
在这里插入图片描述

  1. 计算最优值

    根据计算m[ i ][ j ]的递归式,容易写一个递归算法计算m[ 1 ][ n ]。但是简单地递归将好费指数计算时间。在递归计算时,许多子问题被重复计算多次。这也是该问题可以用动态规划算法求解的又一显著特征。
    用动态规划算法解决此问题,可依据其递归是以自底向上的方式进行计算。在计算的过程中,保存以解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算。

#include<iostream>
#include<cstring> 
using namespace std;
const int maxsize = 100;
int p[maxsize]{ 30,35,15,5,10,20,25 };
int m[maxsize][maxsize], s[maxsize][maxsize];//m[i][j]存储最优解
int n = 6;void MatrixChain()
{int i, r, j, k;for (int i = 1; i <= n; i++) {     m[i][i] = 0;//对角线为0;规模为1时;}for (r = 2; r <= n; r++)//矩阵连乘的规模为r ,从2开始{for (i = 1; i <= n - r + 1; i++)//最大可起始点{j = i + r - 1;//j-i=r-1;m[i][j] = 0x7f7f7f7f;//另开始时m[i][j]为无穷大;s[i][j] = i;//s[][]存储各子问题的决策点,即一开始k为该点。for (k = i; k < j; k++)//寻找最优值{int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];//求出分割点为k时的乘积if (t < m[i][j])//求出最小值,将分割点s[i][j]设置为k;{m[i][j] = t;s[i][j] = k;}}}}
}void print(int i, int j)
{if (i == j)//回归条件{cout << "A" << i << "";return;}cout << "(";print(i, s[i][j]);print(s[i][j] + 1, j);//递归1到s[1][j]cout << ")";
}int main()
{MatrixChain();print(1, n);cout << endl;cout << m[1][n] << endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我在犹豫是不是该收集这几首MP3

我在犹豫是不是该收集这几首MP3&#xff0c;确实&#xff0c;曲子歌词都非常不错。可我找不到收藏的理由。总是一个想法&#xff0c;让我放弃和错过了很多东西&#xff1a;我已经错过和失去了很多&#xff0c;这一次又算什么呢&#xff1f;这样的想法让我在面对很多人或事都已经…

QuestMobile 2017年中国移动互联网年度报告

来源&#xff1a;QuestMobile2017年&#xff0c;科技的风口兜兜转转&#xff0c;从直播、VR到AI再到区块链、短视频泛娱乐IP&#xff0c;最终在2017年底定格在了知识付费上&#xff0c;然而这并没有结束&#xff0c;紧随知识付费而来的就是撒币、大撒币……这就是中国移动互联网…

Python 读写配置文件模块: configobj 和 configParser

参考&#xff1a;http://www.voidspace.org.uk/python/configobj.html Python模块之ConfigParser - 读写配置文件&#xff1a;http://www.cnblogs.com/victorwu/p/5762931.html Python 官网 configparser 文档&#xff1a;https://docs.python.org/3.7/library/configparser.…

快速排序(c++)

1、快速排序的思想 快速排序就是给基准数据找在数组中正确位置的过程&#xff0c;一旦基准位置的正确位置找到&#xff0c;那基准位置左右两边经过同样的步骤递归也可以有序&#xff0c;最终整体数组有序。 整体可以理解为三个步骤&#xff1a; 1、先从队尾开始向前扫描且当l …

设计模式之禅--思维导图

原图ProcessOn里搜索&#xff1a;设计模式之禅

有BRT,为啥还建公交港湾

原来快速公交和普通公交要一块儿跑历山路公交港湾示意图(制图&#xff1a;赵国陆&#xff09;   “历山路上既然跑快速公交车&#xff0c;有BRT站台&#xff0c;还要公交港湾干吗&#xff1f;”21日&#xff0c;本报报道了新公交港湾将在历山路亮相的消息后&#xff0c;不少市…

2018展望| AI:巨头生态开始站队,深入垂直行业才能赚钱

来源&#xff1a;36氪“AI改变世界”这件事&#xff0c;在2018年会更值得人期待。不只是BAT&#xff0c;京东在谈智能仓储配送&#xff0c;滴滴在谈智慧交通……BAT&#xff0c;以及滴滴、京东这样的小巨头&#xff0c;手中攥着大量数据、也有直接服务消费者的场景&#xff0c;…

记录遇到的Python陷阱和注意点

来源&#xff1a;http://www.cnblogs.com/wilber2013/p/5178620.html 最近使用Python的过程中遇到了一些坑&#xff0c;例如用datetime.datetime.now()这个可变对象作为函数的默认参数&#xff0c;模块循环依赖等等。 在此记录一下&#xff0c;方便以后查询和补充。 避免可变…

归并排序(c++)

归并排序 归并排序&#xff08;Merge Sort&#xff09;是建立在归并操作上的一种有效&#xff0c;稳定的排序算法&#xff0c;该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#x…

js 操作 iframe

//页面内有两个iframe<table width"100%"> <tr width"100%"> <td width"100%"> <iframe id"iframeNum1" src"a.aspx" style"display:block;" width"100%"…

五大风口产业全景手绘图(新能源汽车、人工智能等)

来源&#xff1a;一览众车概要&#xff1a;五大风口产业全景手绘图&#xff08;新能源汽车、人工智能等&#xff09;一、新能源汽车二、人工智能三、住房租赁住房租赁产业蕴含着哪些发展机会&#xff1f;各参与方的竞争格局如何&#xff1f;未来人们租房会更便利吗&#xff1f;…

Python进阶之“属性(property)”详解

来源&#xff1a;http://python.jobbole.com/80955/ 参考&#xff1a;廖雪峰的官方网站 使用__slots__ 参考&#xff1a;廖雪峰的官方网站 使用 property Python中有一个被称为属性函数(property)的小概念&#xff0c;它可以做一些有用的事情。在这篇文章中&#xff0c;我们…

冒泡排序(c++)

冒泡排序&#xff08;Bubble Sort&#xff09; 是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列&#xff0c;依次比较两个相邻的元素&#xff0c;如果顺序&#xff08;如从大到小、首字母从Z到A&#xff09;错误就把他们交换过来。走访元素的工作是重复…

微软研发致胜策略读书笔记(转)

创建人&#xff1a;X公司程序员 yunshichen 这篇是我读《微软研发致胜策略》后整理的笔记。身为一个软件开发部门的主管&#xff0c;你的职责是什么&#xff1f;单单完成项目是不足够的&#xff0c;如果你的目标是这样&#xff0c;那么你会做错很多事。我认为准确的表述应该是…

原型模式详解

PrototypeClass.java public class PrototypeClass implements Cloneable {Overridepublic PrototypeClass clone() {try {final PrototypeClass instance (PrototypeClass) super.clone();return instance;} catch (CloneNotSupportedException e) {return null;}} } 1、构…

python 结巴分词(jieba)学习

来源&#xff1a;http://www.gowhich.com/blog/147?utm_sourcetuicool&utm_mediumreferral 源码下载的地址&#xff1a;https://github.com/fxsjy/jieba 演示地址&#xff1a;http://jiebademo.ap01.aws.af.cm/ 特点 1&#xff0c;支持三种分词模式&#xff1a; a,精确模式…

选择排序(c++)

选择排序 选择排序&#xff08;Selection sort&#xff09;是一种简单直观的排序算法。它的工作原理是&#xff1a;第一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后再从剩余的未排序元素中寻找…

隐藏系统用户

/Files/chinhr/HideAdmin0.rar转载于:https://www.cnblogs.com/chinhr/archive/2007/07/11/814743.html

人机交互与智能的思考

来源&#xff1a; 人机与认知实验室概要&#xff1a;在过去的20年里&#xff0c;人工智能一直专注于围绕建设智能体所产生的问题&#xff0c;即在特定的情境下&#xff0c;可以感知并行动的各种系统,在这种情况下&#xff0c;智能是一个与统计学,和经济学相关的理性概念。1.智能…

享元模式详解

SignInfo.java public class SignInfo {/*** 报名人员ID.*/private String id;/*** 考试地点.*/private String location;/*** 考试科目.*/private String subject;/*** 邮寄地址.*/private String postAddress;/*** 获取id.* return the id*/public String getId() {return i…