目录
一、算法总思想
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题。
但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。
二、两个基本要素
1)最优子结构性质:当一个问题的最优解包含了其子问题的最优解时,我们说这个问题具有最优子结构。
2)重叠子结构性质:在问题的求解过程中,很多子问题的解会被多次使用。
三、动态规划的设计步骤
1)找出最优解的性质,并刻画其结构特征
2)递归地定义最优值
3)以自底向上的方式计算出最优值
4)根据计算最优值时得到的信息,构造最优解
四、矩阵连乘问题
给定n个矩阵:A1, A2, …, An,其中Ai与Ai+1是可乘的。确定一种连乘的顺序,使得矩阵连乘的计算量为最小。
设A和B分别是p×q和q×r的两个矩阵,则乘积C=AB为p×r的矩阵,计算量为p*q*r次数乘。
但是对于多于2个以上的矩阵连乘,连乘的顺序却非常重要,因为不同的顺序的总计算量将会有很大的差别。
由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。
首先,最容易想到的是穷举法。
对于n个矩阵的连乘积,设其不同的计算次序为P(n)。 由于每种加括号方式都可以分解为两个子矩阵的加括号问题:(A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下:
计算顺序随n的增长呈指数增长
动态规划法
1、分析最优解的结构
将矩阵连乘积AiAi+1…Aj记为A[i: j]。 设A[1: n] 的其中一个最优解在矩阵Ak和Ak+1处断开,即 A[1: n] = ( A[1: k] )×( A[k+1: n] )。
特征:计算A[1: n]的最优次序所包含的计算矩阵子链 A[1: k]和A[k+1: n]的次序也是最优的。(反证法)
矩阵连乘计算次序问题的最优解包含着其子问题的最优解,这种性质称为最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。
2、建立递归关系
算法分析:
解得
第二个特征为重叠子问题
,即只有两种可能。
用动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算。在计算过程中,保存已解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法。
此算法的计算时间上界为O(n3)。算法所占用的空间显然为O(n2)。
结合上述两种问题特征,第三种方法为备忘录法。
备忘录方法的控制结构与直接递归方法的控制结构相同,区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解。
时间复杂度分析:共有O(n2)个备忘录记录项m[i][j](1<=i<=j<=n),初始化需要O(n2)时间。而每个记录项只填入一次,每次耗时O(n)。故备忘录方式的时间复杂度为O(n3) 。
空间复杂度分析: O(n2)
待续