topo排序解决DP无后效的问题

版权声明: https://blog.csdn.net/qq_38234381/article/details/82961702

先放两道题目:

T1:https://www.luogu.org/problemnew/show/P1137#sub

T2:https://www.luogu.org/problemnew/show/P3387#sub

这两道题目都是需要用到topo排序来解决DP无后效的问题的,我们这里拿T1为例来讲解:

首先是一些概念性的东西:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。 (源自百度)

通俗的说就是,一张有向无环图的拓扑序可以使得任意的起点u,它的一个终点v,在序列中的顺序是u在前v在后。

仔细看DP部分,还记得DP需要满足什么原则吗?无后效性。如果不是在拓扑序中进行DP,会完全破坏无后效性(当然这也下面为什么有人用记忆化搜索的原因,记忆化搜索同样可以解决无后效性的问题)。正是因为拓扑序u在前,v在后的性质,这才选择使用拓扑排序,毕竟它的代码实现很轻松,而且运行时间也不差。

那么知道上面的那些之后,也就不难想到,如果我们在跑topo时跑DP,那么对于我们跑到的每一个点,一定是已经跑完了与它相连的所有的边的,也就是说可能影响到它dp值的每一个点的dp值我们已经更新完了,那么我们用那些得到的dp值更新这个点之后,显然这个点的dp值已经不会再被后面的点影响了,因为前面也已经说过我们是更新完所有可能影响到它dp值的点之后再更新的这个点,所以也就一定不会有后效性了。

上面的两道题都是很好的topo解决DP无后效性的例题。

PS;当然这种方法也不是所有的题目全部适用,还是需要去发现这个性质之后才可以用。

猜你喜欢

转载自blog.csdn.net/qq_38234381/article/details/82961702