动态规划:矩阵连乘问题

动态规划:矩阵连乘问题(个人学习小结,详细解题过程记录)

问题描述

给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
假设矩阵连乘AiAi+1…Aj记为A[i:j],i<=j;

分析最优解的结构

特征:计算A[i:j]的最优次序所包含的计算矩阵子链A[i:k]和A[k+1:j]的次序也是最优的。如下图:
最优解的情况
矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。

建立递归关系

假设A[i:j]的最少数乘次数是m[i][j],那么原问题的最优解就是m[i][n];
假设:
A1=50x10,
A2=10x40,
A3=40x30,
A4=30x5,
那么p0=50,p1=10,p2=40,p3=30,p4=5;
若当前的计算次序为(A1A2)(A3A4),数乘次数:
a.M=A1A2的数乘次数=50x10x40,M的矩阵维度是50x40;
b.N=A3A4的数乘次数=40x30x5;N的矩阵维度是40x5;
c.MN的数乘次数=50x40x5;
总的数乘次数m[1][4]=a+b+c=m[1][2]+m[3][4]+p0p2p4;

当 i=j时,A[i:j]=0;
当i<j时,m[i][j]=m[i][k]+m[k+1][j]+p[i-1]p[k]p[j];

因此,递归公式的定义如下:
递归公式

算法计算顺序的分析

假设当前有6个矩阵连乘,矩阵的初始状态如下:
6个矩阵连乘
根据上表可知:
p0=30,p1=35,p2=15,p3=5,p4=10,p5=20,p6=25;
根据递推公式可以得出如下图的计算过程:计算顺序
在上图中1号线表示的是总体的计算顺序是从2开始计算,到6号结束;
最少数乘次数
上表记录的是最少数乘次数m[i][j]的值,对角线是i=j的情况,此时的m[i][j]=0;
根据递归公式:m[i][j]=m[i][k]+m[k+1][j]+p[i-1]p[k]p[j],i<=k<j,计算m[1][2]的时候k=i=1,所以m[1][2]的计算方式如下:
m[1][2]=m[1][1]+m[2][2]+p[0]p[1]p[2]=30x35x15=15750;
同理,m[2][3]=m[2][2]+m[3][3]+p[1]p[2]p[3]=2625;
当计算m[1][3]的时候,有两种计算方式分别是(A1A2)A3和A1(A2A3),k的取值有1,2两种可能。

当k=1时,m[1][3]=m[1][1]+m[2][3]+p0p1p3=0+2625+30x35x5=7875;
当k=2时,m[1][3]=m[1][2]+m[3][3]+p0p2p3=1575+0+30x15x5=18100;
由于7875<18100,故m
  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值