动态规划(Dynamic Programming) 是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费不必要的时间。
动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。
动态规划其实就是递归,其解决问题的范围也条件也和递归相同,但在算法实现上却有不同,递归的解法一般符合问题的拆分逻辑,从大到小直到终止条件。而动态规划则是拆分问题之后,从最小解出发,从小到大逐步拓展到最终问题,这样子问题的解可以在拓展过程中保留,从而解决递归中重复计算的问题。