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
