网络上有太多关于动态规划的介绍,目前对于刚刚打算仔细学习DP方法的我看着头疼。
先从维基百科入手,了解动态规划的基本概念:
动态规划与贪婪算法以后再说!
动态规划(英语:Dynamic programming,简称DP)通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划只能应用于有最优子结构的问题。
最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。
动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。
通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。
以上写了这么多,可是还没看懂,再换一种,简单粗暴的就用书上的解释吧!
算法设计与分析的教材这样介绍动态规划
规划是比较全面的长远的发展计划。在动态规划算法策略中,这个解释体现在它的决策不是线性而是全面考虑各种不同的情况分别进行决策,最后通过多阶段决策逐步找出问题的最终解。当各个阶段采取决策后,会不断决策出新的数据,直到找到最优解。每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,故有动态的含义,所以,这种多阶段最优化决策解决问题的过程称为动态规划。
基本思想:
把求解的问题分成多个阶段或多个子问题,然后按照顺序求解各子问题。前一子问题的解,为后一问题的求解提供了有用信息。。在求解任一个子问题的时候,列出各种可能的局部解,通过决策保留那些有可能达到最优解的局部解,丢弃其他局部解。依次解决各个子问题,最后一个子问题的解就是初始问题的解。