算法基础(六):动态规划(一)
1、数字三角形
使用二维数组进行存储,原本左下方的数变成正下方,右下的数还在右下方,所以(i,j)->(i+1,j)和(i+1,j+1)
递归:顶部的数的最大路径和在二维数组中等于下方和右下方数字在三角形中的最大路径和,下方的数字的最大路径和又等于它下方和右下方的最大路径和......由此可以得出递归程序,最大路径和等于他下方和右下方的最大值,直到最后一行递归边界值
超时!!!对于路径上的点,假如右后数与另一个数左后数是一个,则该数需要最少算两遍,这样就会造成重复计算,以至于超时
将计算的结果用二维数组保存起来,重复使用时直接访问即可,不需要重复计算
2、递推解决数字三角形
将递归变为递推,计算顺序从下往上
首先将最下方的maxsum值存为其输入的d值,然后从倒数第二行开始往上推,跟递归思路一样,每个数的最大路径和等于其正下方和右下方的最大路径和,这样一直推到最上方
空间优化:我们发现其实从底层向上推,每一行只需要使用一次,所以每次计算可以进行覆盖,只需要保存最后一行
3、动态规划一般思路
动态规划:
1、找寻子问题,即子问题的求解可以推出正确的问题的解决
2、状态,
3、边界值,在递归中,我们经常需要设置递归限制条件即边界状态,
4、状态转移方程,这是最终要的部分,确定状态转移方程在递归中就是确定递归的进行过程,即求解方式
所以在使用动态规划时,首先要考虑该问题是否可以分解成子问题来进行求解,最后得出与原问题一样的解
然后就是考虑状态转移方程,该如何设置,进行由子问题推出原问题
4、最长上升子序列
按照动态规划的思路进行解题
首先找子问题,即将原问题分解为等价的小问题