动态规划
什么是动态规划
通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划原理
动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。
重叠子问题指的是在求解一个大问题的时候需要重复求解多个一样的子问题。
最优子结构可以结合无后效性进行理解,指的是局部最优解能影响全局最优解,只要所有局部是最优解,全局就一定是最优解。
动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。
其中子问题的解可以被保存下来供下一次使用。例如我们有一个递归方程 f ( n ) = f ( n − 1 ) + f ( n − 2 ) . f(n)=f(n-1)+f(n-2)\,. f(n)=f(n−1)+f(n−2).当我们计算 f ( n − 1 ) f(n-1) f(n−1)的时候 f ( n − 2 ) f(n-2) f(n−2)也会被用到,因此如果我们在计算 f ( n − 1 ) f(n-1) f(n−1)的时候将 f ( n − 2 ) f(n-2) f(n−2)保存下来,那么在计算 f ( n ) f(n) f(n)的时候就不需要再计算 f ( n − 2 ) f(n-2) f(n−2)。
动态规划基本步骤包括四步:
1、穷举问题的解,目的是发现问题递归求解的规律,找到关键的状态转移方程。
2、写状态转移方程,例如上面提到的
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
.
f(n)=f(n-1)+f(n-2)\,.
f(n)=f(n−1)+f(n−2).
3、确定边界条件,也就是确定状态转移方程的初始条件,让状态转移方程可以跑起来的初始解,
f
(
1
)
f(1)
f(1) and
f
(
2
)
f(2)
f(2)。
4、构建表格或者map存储重复子问题的解。
动态规划问题
例如背包问题,最优子序列问题等等。
贝尔曼方程
supplement in free time