DP
动态规划问题的小秘籍
1、动态规划的基本思想:将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
2、适用动态规划的条件:
最优子结构
子问题重叠
无后效性
3、分析动态规划必须分析的三个基本要素:
阶段、状态、决策
比如:“黑熊过河”
阶段:石墩
状态:dp[i]:记录到达第i个石墩剩余能量的最大值。
决策:dp[i]=max{ dp[i-1], dp[i-2]}-q+a[i];
且 max{ dp[i-1], dp[i-2]}-q>=0
找状态转移方程的秘决:
找当前状态从哪里来的(上一个状态)。
4、注意事项
动态规划编程实现时用的是表格法,所以要注意赋初始值(递推的起点)。
---------------------------------------------分割线-------------------------------------------------
DP的基本步骤
(1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。注意这若干个阶段一定要是有序或者是可排序的(即无后效性),否则问题就无法用动态规划求解。
(2)选择状态:将问题发展到各个阶段时包含的各种情况用不同的状态表示出来。
(3)确定决策并写出状态转移方程:之所以把这两步放在一起,是因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以,如果我们确定了决策,状态转移方程也就写出来了。
动态规划的关键在于:按照从小到大的次序划分阶段,每个状态只需计算一次并保存下来,这样就避免了对子问题的重复计算。
动态规划的适用条件
(1)最优子结构
问题的整体最优解中包含着它的子问题的最优解,我们把这个特征叫做最优子结构,这也是动态规划求解的前提条件。如上例中“要求黑熊跳到第i个石墩时的最优解,必需先求出跳到第i-1,i-2个石墩的最优解”。
(2)无后效性
当前阶段的状态值,只与之前阶段的状态有关,不受之后阶段的影响。