基础例子-最短路径的问题
对于这样一个例子,一般求解使用暴力破解方式,但每一个节点有2个选择,所以n个节点复杂度为
2
n
{2^n}
2n ,这已经不是一个好的算法啦。
动态规划可以很好的解决这个问题。
- 从后向前每个节点选取小的,例如C1可以选择2与5,要到终点距离最小,只能选取2。
- 以此类推,使用后推法就可以得到最终的最短距离。可以从第四阶段可知S3 与S5 路径最短。
注意:子问题可能不满足全局的最优解
算法设计要素
以矩阵相乘链的问题为例
这里矩阵链相乘为例,动态规划设计按照下面流程:
要素设计
1、每步处理一个子问题,界定子问题边界
2、列出优化函数的递推方程以及初值
这里把矩阵拆分成两部分(最少相乘的次数),在计算两部分乘积Pi-1 Pk Pj(原因如下)
3、问题要满足最优结构:一个最优决策序列的任何子序列本身一定相对与子序列的初值和结束状态的最优决策序列。
递归解决
根据上面递推式,改写成递归如下:
从图可以看出,递归实现的效率不高,同一个子问题计算多遍。可以采用空间换时间。
迭代实现
从下面考虑
迭代过程
- 最小子问题算起
- 计算顺序,保证后面用上前面计算的值
- 存储结构保持计算结果–备忘录
解的追踪
- 设计标记函数标记每一步的决策
- 考虑根据标记函数追踪算法
划分子问题如下:
长度(划分的规模):几个矩阵相乘
代码理解参考图如下: