2018過農曆新年這幾天,學了一下狀態壓縮動態規劃,如今先總結一下。html
狀態壓縮實際上是一種並無改變dp本質的優化方法,階段仍是要照分,狀態仍是老樣子,決策依舊要作,轉移方程仍是得列,最優仍是最優,無後仍是無後,因此它比較好理解。數組
狀壓,顧名思義就是要將一些狀壓想辦法壓縮起來(能夠壓,也能夠刪)。其中這些狀態都知足類似性和數量不少。這樣纔好壓並且壓得有意義。常見於通常的方格題,網絡題等等。網絡
因此通常基礎的狀壓就是將一行的狀態壓成一個數,這個數的二進制形式反映了這一行的狀況。因此位運算能夠幫助咱們解決不少問題。我看了一篇講義,感受挺好的,就直接拿來用了,這裏會介紹二進制的基本操做和一些常見用法。函數
這些操做都是在一個數轉成二進制的狀況下作的,包括按位與&、或|、取反~(注意負數補碼的符號)、異或^(不一樣則真)、左移<<、右移>>。優化
下面是由江蘇省淮陰中學薛志堅整理的一些常見操做:spa
接下來就是進行普通dp的操做。htm
不過這裏要注意幾點blog
初試化狀態的時候要看清條件,什麼要,什麼不要。get
通常狀況下要預處理前k行(k由題目定)。it
Dp時題目給的條件和fit函數、state數組都要檢查。
最最重要的一點:位反(~ ) > 算術 > 位左移、位右移 > 關係運算
> 位與 > 位或 > 位異或 > 邏輯運算
因此通常位運算最好打括號。
講講不常規的狀壓dp。
咱們要找一個方法將多餘的狀態給砍掉或者縮成一段。
上例題:
一、Corn Fields
最基礎的狀壓dp,不少時候能夠用來做爲模板借鑑着作其餘題目。
詳情請看:這裏
二、互不侵犯King
好像是優化搜索,其實仍是dp,不過這裏比t1的條件多了、難了,也比t1多限定了一個國王數量,因此要多存一個國王數量的狀態,可是其實仍是很基礎。
詳情請看:這裏
三、炮兵陣地
這裏從一個單行狀態變成了雙行狀態,其餘都很模板。
詳情請看:這裏
四、過河
這是第一道升級的狀壓,它終於不是普通01串的狀態,而是將沒用的狀態給直接砍掉,再進行dp
詳情請看:這裏
五、強迫症的炸山
這是我同窗(一位大佬)lxy出的題,這道看似很簡短、很簡單的題,作起來卻不是那麼容易。我甚至還沒找到怎麼正確地壓縮狀態。至今未果,之後會慢慢補充。畢竟如今打暴力得了tle,打正解(手動劃去)得了re,我也很無奈。
狀壓dp其實不止這麼簡單,我此次學了只是皮毛中的皮毛,狀壓要捉住怎麼壓縮狀態,加快程序運行,別的就和普通dp同樣了。
請各位大佬指出錯誤或補充,謝謝。
嗯,就這樣了。