【C】基础级算法(2):动态规划(DP)【长文】

导引

若有一矩阵链,其中每两个相邻矩阵均可乘,如何选择运算次数最少的方案进行矩阵的相乘?
比如:A=(10x100),B=(100x5),C=(5x50)
我们知道,mxn矩阵和nxp矩阵相乘,所得到的矩阵为mxp,结果矩阵当中每一个数都是由n组乘法相加得来的。由于乘法比之加法更为复杂,且变换矩阵结合顺序并不影响加法次数,我们得出:
只要研究乘法次数最少的矩阵连乘方案,就得到了最优的结果。
计算此矩阵连乘有以下几种方案:
(AB)C:先100组乘法,构50个数;后5组乘法,构500个数。乘法共7500组。
A(BC):先5组乘法,构5000个数;后100组乘法,构500个数。乘法共75000组。
乘法结合顺序决定了矩阵相乘的复杂度。
算法典例:矩阵连乘问题
这个问题可以采用动态规划的一个重要特性是:若最终得到了唯一最优的分割,其中A[1…k]、A[k+1…n]被断开,那么A[1…n]最优运算次序(最终的解)包含的两个段A[1…k]是最优的,A[k+1…n]也是最优的。同样的,A[1…k]的分割情况就变成了和上述一模一样的子问题求解,其分割的两块子段也分别最优。
最优解的结构是同样最优的子解构成,这称为最优子结构性质。这是能够用动态规划解决的问题的最显著的一个特征。

由于动态规划的思想仅仅是针对子结构最优的问题,随着子问题结构的丰富,动态规划的应用也相当广泛。利用动态规划算法可以解决一系列经典问题:
矩阵连乘问题
迷宫问题
最长公共子序列问题
最大子段和
凸多边形最优三角剖分
图像压缩问题
电路排线问题
流水作业调度
0-1背包问题
最优二叉搜索树

I.矩阵连乘问题

抽象问题为:
矩阵连乘A[1…n],其中Ai是li * ri矩阵;
一个实例是:
A1:30 * 35 A2:35 * 15 A3:15 * 5 A4:5 * 10 A5:10 * 20 A6:20 * 25
取二维数组m[n+1][n+1]用于存储探索结果。m[i][j]存储A[i…j]的最优解。那么在定义之初我们立刻可以获知:
m[i][i]=0,因为矩阵自身不需要相乘。
m[i][i+1]总是可以立即计算的。例如A2:35 * 15 A3:15 * 5 ,则m[2][3]=35 x 15 x 5=2625
那么m[i][i+2]是进一步可以考虑计算的,从而在矩阵上一对角线、一对角线地由中央向右上角求解(最后得到)m[1][n]
m[i][j]的计算过程是:在i到j之间选取一切k,将之分割成
在这里插入图片描述

则m[i][j]=m[i][k]+m[k+1][j]+inner,其中

在这里插入图片描述
并在这些k的取值当中选取最小的取值。
这样就完成了递归关系建立。从而我们也能够填写整个m[][]表:
在这里插入图片描述
如果我们要寻求的是最优的连乘顺序,只需要查找

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值