1. 程式人生 > >topo排序解決DP無後效的問題

topo排序解決DP無後效的問題

先放兩道題目:

這兩道題目都是需要用到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;當然這種方法也不是所有的題目全部適用,還是需要去發現這個性質之後才可以用。