算法第三章作业2
动态规划的基本思想
-
多阶段图最短路问题
下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由。求的最省费用。
此图有明显的次序,可以划分为5阶段。故此问题的要求是:在各个阶段选取一个恰当的决策,使由这些决策组成的一个决策序列所决定的一条路线,其总路程最短。
分析:如果的最短路已知,的最短路已知 知道了最短路
所以,动态规划有以下两个特点
-
原问题的最优解包含了子问题的最优解最优子结构
-
求解问题时
-
问题依赖的最优解
-
问题依赖的最优解
-
可以看出,的解被重复使用,子问题的解被多次使用子问题重叠重复计算
设计问题的步骤
-
找出最优解的性质,刻画其结构特征
-
递归的定义最优值
-
以自底向上的方式计算它
-
根据计算最优值时得到的信息,构造最优解
定义递归函数注意要点
-
传的参数,以及它的范围条件
-
递归的边界条件,通常在记忆化搜索中,以记录的元素存在为边界条件
if(Memorized[i][j]) return Memorized[i][j];
-
剪枝的条件
矩阵连乘问题
给定个矩阵:,其中与是可乘的。确定一种连乘的顺序,使得矩阵连乘的计算量为最小。
-
如果直接顺序相乘,矩阵连乘的基本乘法数是
可以发现,在矩阵很多时,乘法的数目是很庞大的,因此,我们需要最小化乘法的次数来减少计算的时间。
-
不同计算顺序的差别
可以发现:求多个矩阵的连乘积时,计算的结合顺序是十分重要的。
-
考虑一种四个矩阵相乘的特殊情况
设矩阵为 ,的行列为 的行列为以此类推.
这样,四个矩阵的行列值,可以通过一个一维数组存放.
int p[5] = {p0,p1,p2,p3,p4};
根据上表的计算顺序对于乘法次数的影响我们可以发现,乘法次数的大小取决于加的括号的位置,于是,我们可以对这四个矩阵的乘法顺序进行划分,有以下三种情况
-
-
-
现在要做的工作就是,如果求出了,,,这四个子问题的乘法次数的最小值,再把它们三种情况进行比较,就求得了整个问题的最小值.
如果设是矩阵的值,那么,上述三个的乘法次数如下
-
-
-
通过观察,我们可以归纳出从到的通用方程
-
从到的通用方程
设矩阵 ,是划分的位置
-
-
-
备忘录
使用记录已经求过的子问题,避免了相同子问题的重复计算
递归求解
循环求解
如何避免递归?
可以发现,递归是自顶向下的求解过程,如果我们换一种思路,从树底求解最小子问题(两个矩阵连乘的问题),再用求解好的子问题求解更上层的问题,最终达到求解1-n整个问题答案的目的
时间复杂度为:
空间复杂度为:
-
Code