今天和杨哥、蒋、章师兄突然间讨论到了动态规划, 半天搞不出来,于是乎查了一些资料,理解如下:
动态规划的三个性质
- 最优子问题:A到C的最优解中的B到C的那一段也一定是B到C的最优解
- 无后效性:A到B的问题和B到C的问题无耦合,可以分别单独求解
- 重叠子问题:A到B和B到C的问题属于一类问题,可以用同一套公式写出
下面看两类代表性的动态规划问题
gridworld类型
如上图,从左上角到右下角求一条权值和最短的路径(在一般的走迷宫问题中,全是权值为1即可)
做法注意事项:
- 首先推出:每一次一定是只能向下或者向右走,向左或者向上一定会有比它更优的路径;
- 其次,动态规划的状态怎么设?每个点(i, j)设一个状态!
- 最后,状态一定要有一个含义,这里令状态为D[i, j],表示从起点到(i, j)的最短路径所需要的距离;
搞清楚了这三点,按照动态规划的通用套路,我们需要找出子问题是啥。这里,子问题就是从上到下、从左到右一个一个算出一个新的D[i, j]。则可以知道递推公式为:
D
[
i
,
j
]
=
m
i
n
{
D
[
i
−
1
,
j
]
,
D
[
i
,
j
−
1
]
}
+
(
i
,
j
)
点
的
费
用
D[i, j] = min\{D[i-1, j], D[i, j-1]\} + (i, j)点的费用
D[i,j]=min{D[i−1,j],D[i,j−1]}+(i,j)点的费用
那么,我们从起点出发,先算第一排:
再算第一列:
然后一个一个算即可:
网络图结构类型
这类问题如下图,我们还是要算从A到G的最短路径
按照上面的经验,最关键的问题其实是明确“”“阶段是什么,状态的含义是什么”。这里,由图本身的结构,我们很容易想到,阶段就是A、B……G,而每个点的状态表示的意思就是“从该点开始到G的最短路径距离”。
于是,DP的过程就是一个一个点算出它的最短路径距离。那么,一种从后往前的DP方法可以是:(也可从前往后)
- 先在G
- 到下一阶段F,算出F1和F2的最短距离分别是4,3;
- 到E,根据无后效性,F1和F2的值已经不变了,只需要在此基础上算出E1/E2/E3的最短距离即可,如E1: m i n { 3 + 4 , 5 + 3 } = 7 min\{3+4, 5+3\}=7 min{3+4,5+3}=7
- 重复往前,直到A