动态规划是解决多阶段决策问题的一种方法。
多阶段决策问题:如果一类问题的求解过程可以分为若干个互相联系的阶段,在每一个阶段都需作出决策,并影响到下一个阶段的决策。
多阶段决策问题,就是要在可以选择的那些策略中间,选取一个最优策略,使在预定的标准下达到最好的效果.
最优性原理:
1.不论初始状态和第一步决策是什么,余下的决策相对于前一次决策所产生的新状态,构成一个最优决策序列。
2.最优决策序列的子序列,一定是局部最优决策子序列。
3.包含有非局部最优的决策子序列,一定不是最优决策序列。
指导思想:
在做每一步决策时,列出各种可能的局部解依据某种判定条件,舍弃那些肯定不能得到最优解的局部解。以每一步都是最优的来保证全局是最优的。
从一开始的"数塔"说起吧,运用dp的话,使的每一个元素都被赋予一个状态,依据所有不同的状态,递归再递推,得到公式就好求解了,而用贪心算法的话,则可能是一层一层的求解,没有把前后的状态相关联,最后所求的的就往往不是最优解。
动态规划问题具有以下基本特征:
问题具有多阶段决策的特征。
1.每一阶段都有相应的“状态”与之对应,描述状态的量称为“状态变量”。
2.每一阶段都面临一个决策,选择不同的决策将会导致下一阶段不同的状态。
3.每一阶段的最优解问题可以递归地归结为下一阶段各个可能状态的最优解问题,各子问题与原问题具有完全相同的结构。
解题步骤:
1、判断问题是否具有最优子结构性质,若不具备则不能用动态规划。
2、把问题分成若干个子问题(分阶段)。
3、建立状态转移方程(递推公式)。
4、找出边界条件。
5、将已知边界值带入方程。
6、递推求解。
记忆化搜索:排除重复计算。由于dp需要对每一个元素都标记状态,所以数据计算量非常的大,经常可能造成超时,在解题过程中需要寻找优化的方法来排除重复计算或是简化计算,我目前比较印象深刻的是求最优子序列中的归零处理,归零的处理非常巧妙,可以是的数据从前遍历,依次给每一个数赋予状态,这与我一开始的计算法相比实在简洁太多。