动态规划:矩阵连乘问题(文末附有手写版例题)

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

连乘次数

A是一个p × q矩阵,B是一个q × r矩阵,AB相乘,得到的矩阵元素个数为p × r,每个元素由q次乘法得到,因此所需乘法次数为p × q × r。


问题描述

在计算矩阵连乘积时,加括号的方式对计算量有影响。

例如有三个矩阵A1,A2,Ag连乘,它们的维数分别为
10x100,100×5,5×50。用第一种加括号方式(A1A2)A3计算,则所需数乘次数为

10×100×5+ 10×5×50 = 7500。用第二种加括号方式A1(A2A3)计算,需要

100×5×50+10×100 x50=75000次数乘。

Sample Input

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

Sample Output

15125
((A1(A2A3))((A4A5)A6))

解题思路:

先引入以下符号:

  • n表示矩阵的个数。
  • 表示第i个矩阵。
  • A[i: j]表示矩阵连乘矩阵相乘次数 动态规划,算法设计与分析,动态规划,算法
  • 表示 的列数
  • 表示 的行数
  • k表示矩阵连乘断开的位置为k,表示在 和矩阵相乘次数 动态规划,算法设计与分析,动态规划,算法 之间断开
  • m[i,j]表示A[i:j]的最少乘次,m[1, n]即问题的最优解

符号解释:由矩阵相乘的条件可知:前一个矩阵的列数 = 后一个矩阵的行数。因此, 既是 的列数,也是矩阵相乘次数 动态规划,算法设计与分析,动态规划,算法 的行数。结合下面的示意图有助于理解:

矩阵相乘次数 动态规划,算法设计与分析,动态规划,算法

该问题有一个关键特征:计算矩阵链A[1:n]的最优计算方式,包含了子矩阵链A[1:k]和A[k+1:n]的最优计算方式。

一般地,如果原问题的最优解,包含了其子问题的最优解,则我们称这种性质为最优子结构性质。若问题具有最优子结构性质,则可用动态规划算法求解。

首先,建立递归关系,写出递归公式

矩阵相乘次数 动态规划,算法设计与分析,动态规划,算法

 公式解释:假设k是对矩阵链A[i:j]一分为二得到最优解时的断开位置,则m[i,k]和m[k+1,j]分别是两个子矩阵链A[i,k]和A[k+1,j]的最优解。两个矩阵最后要相乘才能得到A[i,j],因此,最后要加上,也就是两子矩阵相乘的数乘次数,才能得到总的数乘次数。


然后,根据递归公式计算最优解

在程序中,m的实现是一个二维数组,也就是一张二维表,为了方便计算,m的下标从1开始。要计算A[1:n]的最少乘次,本质上是求m[1][n]的值,也就是二维表表右上角的值。

例如,连乘矩阵个数为6,维数分别为:

        A1(30×35),A2(35×15),A3(15×5),A4(5×10),A5(10x20),A6(20×25)

填表方式如下图所示:

矩阵相乘次数 动态规划,算法设计与分析,动态规划,算法

原问题现已转化为填表问题,要填充的是矩阵右上三角部分的值。
根据递归公式,对角线的值为0。其他值需要根据于断开位置k的值来得到,k ∈[i,j),我们要遍历所有k,就要访问所求值的所有同一行左边的值和同一列下方的值。因此,在代码中我们可以使用自底向上、从左到右的计算顺序来依次填充,最终得到右上角的值。

矩阵相乘次数 动态规划,算法设计与分析,动态规划,算法

 伪代码如下:

    for i<-1 to n do
        dp[i][i] = 0
    for length<-2 to n do				//length是相乘矩阵链的长度
        for begin<-1 to n-length+1 do	//begin是相乘矩阵链的第一个矩阵
            end = begin + length - 1	//end是相乘矩阵链的最后一个矩阵
            dp[begin][end]<-∞
            for index <- begin to end-1 do
                temp = dp[begin][index] + dp[index+1][end] + p[begin-1]*p[index]*p[end]
                if temp < dp[begin][end] then
                    dp[begin][end] = temp

 完整代码

#include<iostream>
using namespace std;
const int N = 100;
int A[N];//矩阵规模
int m[N][N];//最优解
int s[N][N];
void MatrixChain(int n)
{
	int r, i, j, k;
	for (i = 0; i <= n; i++)//初始化对角线
	{
		m[i][i] = 0;
	}
	for (r = 2; r <= n; r++)//r个矩阵连乘
	{
		for (i = 1; i <= n - r + 1; i++)//r个矩阵的r-1个空隙中依次测试最优点
		{
			j = i + r - 1;
			m[i][j] = m[i][i]+m[i + 1][j] + A[i - 1] * A[i] * A[j];
			s[i][j] = i;
			for (k = i + 1; k < j; k++)//变换分隔位置,逐一测试
			{
				int t = m[i][k] + m[k + 1][j] + A[i - 1] * A[k] * A[j];
				if (t < m[i][j])//如果变换后的位置更优,则替换原来的分隔方法。
				{
					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()
{
	int n;//n个矩阵
	cin >> n;
	int i, j;
	for (i = 0; i <= n; i++)
	{
		cin >> A[i];
	}
	MatrixChain(n);
	cout << "最佳添加括号的方式为:";
	print(1, n);
	cout << "\n最小计算量的值为:" << m[1][n] << endl;
	return 0;
}


 矩阵相乘次数 动态规划,算法设计与分析,动态规划,算法

 例题:

 对知矩阵规模序列<5,10,3,12,5,50,6>,求矩阵链最优括号化方案

矩阵相乘次数 动态规划,算法设计与分析,动态规划,算法

矩阵相乘次数 动态规划,算法设计与分析,动态规划,算法

思路文章链接:https://www.jianshu.com/p/59f6fac01315
来源:简书文章来源地址https://www.toymoban.com/news/detail-765556.html

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

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

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

相关文章

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

    算法总体思想          动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题         但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。        

    2024年01月16日
    浏览(17)
  • 动态规划:矩阵连乘问题,字节跳动今日学习内容

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

    2024年04月11日
    浏览(21)
  • 『动态规划』矩阵连乘

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

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

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

    2024年02月09日
    浏览(17)
  • 动态规划详细讲解c++|经典例题讲解认识动态规划|0-1背包问题详解

    uu们,你们好!这次的分享是动态规划,其中介绍了动态规划的相关概念和做题模板(三要素),同时为了uu们对动态规划方法有更加形象的认识,特地找了两个经典问题,和大家一起分析。并且呢,为了大家检验自己的学习成果,我专门在常用的oj上为uu们找到了相关题目的

    2024年04月11日
    浏览(16)
  • 矩阵连乘问题

    【问题】:矩阵链乘问题 : 给定n个矩阵{A1,A2,...,An},其中Ai与Ai+1是可乘的,i=1,2...,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 1、按设计动态规划算法的步骤解题。 (1)找出最优解的性质,并刻划其结构特征。 (2)递归

    2024年02月06日
    浏览(12)
  • 矩阵连乘问题C语言实现

    给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。如数据文件input.txt为: 6(矩阵个数) 30 35 15 5 10 20 25

    2024年02月06日
    浏览(36)
  • 动态规划--矩阵链相乘问题

    明确原始问题A[1:n]: 计算矩阵链 所需的 最小乘法次数。 (1)是否满足最优子结构,问题的解是否包含子问题的优化解? 若计算A[1:n]的优化顺序在 k 处断开矩阵链,即A[1:n]=A[1:k]×A[k+1:n],则在A[1:n]的优化顺序中,对应于子问题A[1:k]的解必须是A[1:k]的优化解,对应A[k+1:n]的解必

    2024年01月25日
    浏览(16)
  • 动态规划问题——矩阵的最小路径和

    题目: 给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有路径中最小的路径和。 示例: 给定的m如下: 1        3         5        9 8        1        3        4  5        0        6 

    2023年04月08日
    浏览(19)
  • [算法]动态规划以及常见例题

    之前买的假书害人捏......不过有个问题没说错,动态规划和递归很相似,但是动态规划利用分治法 ,把大问题转化为子任务,当计算出 一个子任务的结果将储存 起来, 避免对于同一个子任务的重复计算 但其实根据某本书的写法,就是给递归套了一层存储的壳子......这个做法其实其

    2024年02月04日
    浏览(14)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包