一 动态规划的定义:
算法导论给出的定义:通过组合子问题的解来求最优问题的解。该定义太简单了。满足该定义的解法还有分治法、贪婪法。
二 动态规划的求解过程:
1 描述最优解的结构(描)
2 自顶向下递归的拆子问题(拆)
3 按自底向上的方式递归求解子问题(反求)
4 组合子问题求解(组)
如果第3步是直接自顶向下求解的话就是简单的递归方法了
三 适用于动态规划的应用场景:
1 最优子结构
最优子结构:全局问题的最优解包含子问题的最优解
2 子问题重叠
子问题重叠:一个递归算法中不断的调用同一个子问题
四 实例分析 :矩阵链乘法
给定由n个要相乘的矩阵构成的序列A1,A2,A3,…,An,其中每一元素A i是ai-1 *ai的矩阵。要计算其乘积,求计算标量最小的计算顺序。Ai-Ai 的标量是ai-1 *ai*ai+1
1 描
假设Si,j 是Ai,…,Aj序列的最优解的标量值(i<
j),定义 Si,j = Si,k+Sk+1,j(i<=
k<
j) 那么Si,k也一定是Ai,…,Ak序列的最优解。而本问题的解为S1,n
2 拆
Si,j = min(Si,k+Sk+1,j)(i<=
k<
j)
Si,i = 0
3 反求
j=n;l=1;
do{
for(i=1;i’<’j;i++)
{
Si,i+l
}
}while( 1==j )
每求Si,i+l 时间复杂度为On