动态规划(dynamic programming)用于解决最优解问题,以前在做OJ上面的题目的时候,遇到这类问题总也不知道该怎么做,一些看似很棘手的问题也不知道如何设计算法,最近阅读《算法导论》,在此做一下总结和笔记。
什么是动态规划(what)
首先,要理解动态规划所针对的问题——最优化问题,通俗的讲就是问题的目标是求解最大值(最小值)。动态规划的主要思想是将原问题分解为若干子问题,通过组合子问题来解决原问题。原问题分解成子问题这个思路跟分治法(divide and conquer)类似。那么它与分治法有什么不同呢?分治法采用递归来整合子问题,而且这些子问题通常是不同的。如果这些子问题有大量相同,那么我们在使用分治法的过程中,子问题递归到最底层,子问题就会被重复的执行。因此,如果我们能直接利用已经计算过的子问题的结果,就能大量节省时间,这就是动态规划的方法的核心。