狀壓DP初探·總結

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同樣了。

 

請各位大佬指出錯誤或補充,謝謝。

 

嗯,就這樣了。

相關文章
相關標籤/搜索