文章目录
有了数字三角形(1)的基础,下面,我们进一步改进向着动态规划进发。
进一步的改进
递归虽然简单方便,效率实在不敢恭维,许多时候我们需要把递归改为递推,改用循环实现
分析
我们知道底边到底边的最大和就是该位置权重
那么倒数第二行到底边的最大和就是其权重加左右下角中最大的最大和的,求出填入表中。
同理倒数第三行也可以如此
so
我们就不需要递归了,直接两重循环即可求出所有位置的最大和,我们记录最大和也不需要二维数组,可以挤空间,更进一步我们可以存在D数组最后一行,空间更加优化。
递归到动态规划的一般转化思路
1.分解为子问题
2.确定状态
计算的时间复杂度由状态数量和计算状态的代价决定。
3.找边界值
边界值就是仅一步计算即可得出结果的值,由边界层层递推向上,填充数组。
4.确定状态转移方程(递推公式)
什么问题可以用动态规划
1.最优子结构
比如数字三角形,原问题该位置到底边的最大值,它的子问题是左下方的位置到底边的最大值和右下方到底边的最大值,原问题要求子问题必须也是最优的。
2.无后效性
原问题不需要关心子问题的解是如何得出的,它只需要子问题确定值后,用子问题的值计算原问题的值。