2018過農曆新年這幾天,學了一下狀態壓縮動態規劃,現在先總結一下。
狀態壓縮其實是一種並沒有改變dp本質的優化方法,階段還是要照分,狀態還是老樣子,決策依舊要做,轉移方程還是得列,最優還是最優,無後還是無後,所以它比較好理解。
狀壓,顧名思義就是要將一些狀壓想辦法壓縮起來(可以壓,也可以刪)。其中這些狀態都滿足相似性和數量很多。這樣才好壓而且壓得有意義。常見於一般的方格題,網路題等等。
所以一般基礎的狀壓就是將一行的狀態壓成乙個數,這個數的二進位制形式反映了這一行的情況。所以位運算可以幫助我們解決很多問題。我看了一篇講義,感覺挺好的,就直接拿來用了,這裡會介紹二進位制的基本操作和一些常見用法。
這些操作都是在乙個數轉成二進位制的情況下做的,包括按位與&、或|、取反~(注意負數補碼的符號)、異或^(不同則真)、左移<
接下來就是進行普通dp的操作。
不過這裡要注意幾點
初試化狀態的時候要看清條件,什麼要,什麼不要。
一般情況下要預處理前k行(k由題目定)。
dp時題目給的條件和fit函式、state陣列都要檢查。
最最重要的一點:位反(~ ) > 算術 > 位左移、位右移 > 關係運算
> 位與 > 位或 > 位異或 > 邏輯運算
所以一般位運算最好打括號。
講講不常規的狀壓dp。
我們要找乙個方法將多餘的狀態給砍掉或者縮成一段。
上例題:
1、corn fields
最基礎的狀壓dp,很多時候可以用來作為模板借鑑著做其他題目。
詳情請看:這裡
2、互不侵犯king
好像是優化搜尋,其實還是dp,不過這裡比t1的條件多了、難了,也比t1多限定了乙個國王數量,所以要多存乙個國王數量的狀態,但是其實還是很基礎。
詳情請看:這裡
3、炮兵陣地
這裡從乙個單行狀態變成了雙行狀態,其他都很模板。
詳情請看:這裡
4、過河
這是第一道公升級的狀壓,它終於不是普通01串的狀態,而是將沒用的狀態給直接砍掉,再進行dp
詳情請看:這裡
5、強迫症的炸山
這是我同學(一位大佬)lxy出的題,這道看似很簡短、很簡單的題,做起來卻不是那麼容易。我甚至還沒找到怎麼正確地壓縮狀態。至今未果,以後會慢慢補充。畢竟現在打暴力得了tle,打正解(手動劃去)得了re,我也很無奈。
狀壓dp其實不止這麼簡單,我這次學了只是皮毛中的皮毛,狀壓要捉住怎麼壓縮狀態,加快程式執行,別的就和普通dp一樣了。
請各位大佬指出錯誤或補充,謝謝。
嗯,就這樣了。
狀壓DP的總結
狀壓dp的標誌 資料小 通過題目所給出的條件以後得到的特徵集合小 一 cf259div2 d 題目大意 保證b i 中每個數互質,給出a i 然後求1 n的abs a i b i 最小。a i 30 思路 首先得到b i 必然小於60。這個很重要,因為我們列舉的b的集合就是60.首先當b如果都取1,...
狀壓dp 玉公尺田 狀壓dp
相關 強相關 327.玉公尺田 狀壓dp 小國王 狀壓dp 是井字形,本題是十字形。思路 狀態計算 時間複雜度 n 2 n 2n o n 22n 12 2 24n 2 n 2 n o n2 12 2 n 2n 2 n o n22n 12 224 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...
狀壓dp(總結)狀態壓縮
狀壓這個和二進位制分不開關係 所以,對於二進位制的熟悉是必不可少的技能 與操作,1不變,0變0 或操作,0不變,1變1 異或操作,0不變,1取反 取反操作,把每乙個二進位制位0變1,1變0 還有一些複雜操作可以根據這些去理解 狀態壓縮 所謂狀態壓縮就是把dp的每一次轉移時的狀態用二進位制來表示 或者...