dp多維狀態的優化


dp多維狀態的優化

面對一個多維dp問題,根據維度之間聯系的緊密程度,我們可以選擇

1.維度之間緊密相關,只能直接枚舉

2.維度之間完全無關,只是貢獻通過某種形式相加,可以割裂為兩個dp處理

3.介於1,2之間,不能割裂計算,但是可以將轉移過程割裂為若干步來優化

e.g.1: 選區間1

問題描述

對於所有二元組\(a,b, (a,b\in[1,n]\cap \Z, a\leq b)\),給出了其權值\(w_{a,b}\)

現在求一個元組序列\(A=(a_1,b_1),(a_2,b_2),\cdots\),滿足\(a_1<a_2,b_2<b_1\)

定義\(\displaystyle w_A=\sum w_{a_i,b_i}+\sum w_{a_{i-1},a_i}+\sum w_{b_{i-1},b_i}\) ,最大化\(w_A\)

原dp

\(dp_{a,b}\)表示最后一個元組為\(a,b\)時的最大權值,狀態數為\(O(n^2)\)

直接轉移復雜度為\(O(n^2)\),總復雜度為\(O(n^4)\)

分布轉移

兩維的狀態決定了權值,因此不可以割裂

但是兩個維度在轉移時並沒有必然聯系,因為只涉及\(a_{i}\)\(a_{i+1}\)\(b_i\)\(b_{i+1}\)的關系

因此可以先轉移\(a\)這一維,然后再轉移\(b\)這一維

具體的,轉移可以描述如下

1.\(dp_{a,b}+w_{a,c}\rightarrow f_{c,b}\)

2.\(f_{c,b}+w_{d,b}+w_{c,d}\rightarrow dp_{c,d}\)

優化后轉移復雜度為\(O(n)\),狀態數雖然加倍但是不影響量級

總復雜度為\(O(n^3)\)


e.g.2: 選區間2

問題描述

對於所有二元組\(a,b, (a,b\in[1,n]\cap \Z, a\leq b)\),給出了其權值\(w_{a,b}\)

現在求一個元組序列\(A=(a_1,b_1),(a_2,b_2),\cdots\),滿足\(a_1<a_2,b_2<b_1\)

定義\(\displaystyle w_A=\sum w_{a_{i-1},a_i}+\sum w_{b_{i-1},b_i}\) ,最大化\(w_A\)

原dp

\(dp_{a,b}\)表示最后一個元組為\(a,b\)時的最大權值,狀態數為\(O(n^2)\)

直接轉移復雜度為\(O(n^2)\),總復雜度為\(O(n^4)\)

分布轉移

容易發現這個問題同樣適用選區間1的優化

割裂

容易發現權值由\(a_i,a_{i+1}\)\(b_i,b_{i+1}\)決定,不需要知道過程中每一個\(a_i,b_i\)的組,只需要知道數量

\(a,b\)有單調性,所以關於\(a\leq b\)的限制只需要最后滿足即可

\(f_{i,j}\)表示已經枚舉了\(i\)個元素,最后一個\(a_i=j\)時的最大值

同理,令\(g_{i,j}\)已經枚舉了\(i\)個元素,最后一個\(b_i=j\)時的最大值

狀態數為\(O(n^2)\),轉移復雜度為\(O(n)\),最后可以在\(O(n^2)\)時間內合並\(f,g\)的貢獻

總復雜度為\(O(n^3)\)


e.g.3: 足球

Source: COCI2012/2013 Contest#5 F

問題描述

\(2n\)個人踢球,兩隊各\(n\)個人,一開始球在A隊1號

每秒鍾,按照一定概率球可能會被某一些對手搶走,或者傳給某一些隊友,或者射門

射門只有一定概率\(p_i\)射中,每次射門之后球會到對方1號隊員

\(T\)秒后比分為\(a,b\)的概率,如果一隊得分達到\(r\),視作勝利,比賽結束

為了便於分析,\(O(n)=O(T),O(r)=O(\sqrt n)\)

原dp

記錄時間、比分、球的位置,狀態數為\(O(Tnr^2)=O(n^2r^2)\)

轉移枚舉的情況不超過\(2n\),轉移復雜度為\(O(n)\),總復雜度為\(O(n^3r^2)\)

割裂

在記錄比分的同時記錄球的位置並沒有意義,因為實際上關鍵事件實際上就是射門,每次射門之后球所在位置情況是\(O(1)\)

那么新的dp將 球的位置比分情況 割裂開來

1.處理球的位置,令\(f_{i,j,k}\)表示一開始球在\(i\)隊1號時,第一次射門是在\(j\)時刻,由球員\(k\)射門(\(k\)可以是兩隊中任何一個)

狀態數為\(O(Tn)\),轉移為\(O(n)\),這一部分復雜度為\(O(n^3)\)

2.比分情況

\(g_{i,j,a,b}\)表示\(i\)時刻,球在\(j\)隊1號,當前比分為\(a:b\)的概率

狀態數為\(O(Tr^2)\),轉移為\(O(T)\),總復雜度為\(O(T^2r^2)\)


e.g.4: 異或

Source: CSP-S 2020 初賽完善程序2 (大霧

給定長度為\(n\)的序列\(a_i\in[0,m),m=2^{16}\)\(n\leq 10^{5}\)

\(w(x)=\text{pop\_count}(x)+x\),求一個子序列\(b_i\)

最大化\(\sum w(b_i\oplus b_{i+1})\)

原dp

\(dp_{x}\)表示子序列最后一個元素為\(x\)時的答案,狀態數為\(O(m)\)

對於每個數\(a_i\),枚舉前驅狀態進行轉移,復雜度為\(O(m)\)

總復雜度為\(O(nm)\)

分布轉移

這道題看似是一個1維dp,但是實際上實際上權值是分位處理的

我們不如先看一個類似的選區間問題的變體

對於所有二元組\(a,b, (a,b\in[1,n]\cap \Z)\),給出了其權值\(w_{a,b}\)

給定了一個元組序列\(A=(a_1,b_1),(a_2,b_2),\cdots\)

現在要選出\(A\)的一個子序列\(B\),定義\(\displaystyle w_B=\sum w_{a_{i-1},a_i}+\sum w_{b_{i-1},b_i}\) ,最大化\(w_B\)

實際上這兩個問題是完全相同的,但是由於限制了\(a_i,b_i\)為子序列,導致分布顯得比較奇怪

分布轉移的過程中,轉移狀態應該是這樣的

\((a_1,b_1)\rightarrow (a_2, b_1) \rightarrow (a_2,b_2)\)

容易發現這個過渡狀態\((a_2,b_1)\)實際上並不是一個存在的元組,並不滿足匹配關系

那么我們如何得到這個過渡狀態呢?

1.我們手里有\((a_1,b_1)\)的dp值\(dp_{a,b}\)

2.我們並不知道\(a_2\),於是需要向所有可能的\(a_2\)轉移,得到\(f_{c,b}\)

\(\forall c,dp_{a_1,b_1}+w(b_1,c)\rightarrow f_{c,b_1}\)

3.當拿到\(a_2,b_2\)時,此時我們已經知道了\(a_2\),但是不知道\(b_1\),因此需要從所有\(b_1\)中得到\(dp_{a_2,b_2}\)的值

\(\forall c,f_{a_2,c}+w(c,b_2)\rightarrow dp_{a_2,b_2}\)

分析會發現,\(dp_{a,b}\)反而在這個過程中只是一個過渡值,並不需要開數組記錄

於是就得到了完善程序的dp


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM