动态规划的思想 是将一个问题分解为若干子问题,并且子问题之间还有重叠,通过先求解这些子问题的最优解,将原问题的最优解通过这些子问题的最优解构造出来,从而得到原问题的最优解。
由此可以得到动态规划算法的应用场景:若求一个问题的最优解(通常是求最大值或者最小值),而且该问题能够分解成若干个子问题,并且子问题之间还有重叠的更小的子问题,就可以考虑用动态规划来解决这个问题。
由此总结一下判断一个问题是否能用动态规划来解决的基本步骤:
1.看这个问题是否是求最优解(最大值或者最小值)
2.看该问题能否分解为若干个子问题,且整体问题的最优解是可以由各个子问题的最优解得出的。(最优子结构)
3.看分解的各个子问题之间是否有重叠(这不是应用动态规划的必要条件,但如果子问题没有重叠,那么使用动态规划算法与其他算法相比就没有什么优势,完全可以直接用分治思想解决,不必要用动态规划)
如果一个问题满足以上三个特征,那么就可以用动态规划的思想解决,使用动态规划的步骤为:
1.划分状态,即划分子问题。把问题划分为若干个小问题,划分时要注意,较大的问题的最优解一定可以由较小的问题的最优解得到。最后的求解思路就是先得到小问题的最优解,然后由小问题的最优解逐步构造大问题的最优解,最后得到想解决问题的最优解。
2.状态表示,即如何让计算机理解子问题。确定怎么描述各个不同大小的问题的状态,将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来,作为得到最优解的必要信息。
3.找出状态转移方程,