动态规划本质上为带备忘录的穷举算法。对动态规划问题,直接套框架即可:问题有什么「状态」,有什么「选择」,然后穷举。
设计思想
动态规划算法适用于组合优化问题,通过划分子问题的边界,从子问题开始逐层向上求解,通过子问题之间的依赖关系进行推导计算,最大限度减少重复工作,提高算法效率。但需要较大的存储空间来存储子问题计算的中间结果。
使用动态规划的必要条件
使用动态规划的问题,必须满足优化原则
-
适用动态规划算法解决的问题的特征:
(1) 求解的问题是多阶段决策(优化)问题
(2)求解的过程是多步判断,从小到大依次求解每个子问题,最后求解的子问题即为原始问题
(3)子问题目标函数最优值之间存在依赖关系
(4)子问题符合「最优子结构」,即:子问题间必须互相独立。 -
优化原则:
一个最有决策序列的任何子序列本身一定是相对于子序列的初始和结束状态的最有决策序列
可以通俗理解为子问题间必须互相独立。
啥叫相互独立?你肯定不想看数学证明,我用一个直观的例子来讲解。
比如说,假设你考试,每门科目的成绩都是互相独立的。你的原问题是考出最高的总成绩,那么你的子问题就是要把语文考到最高,数学考到最高…… 为了每门课考到最高,你要把每门课相应的选择题分数拿到最高,填空题分数拿到最高…… 当然,最终就是你每门课都是满分,这就是最高的总成绩。
得到了正确的结果:最高的总成绩就