狀壓dp入門


(先處理好基本的位運算的東西)

為了更好的理解狀壓dp,首先介紹位運算相關的知識。

1.’&’符號,x&y,會將兩個十進制數在二進制下進行與運算,然后返回其十進制下的值。例如3(11)&2(10)=2(10)。

2.’|’符號,x|y,會將兩個十進制數在二進制下進行或運算,然后返回其十進制下的值。例如3(11)|2(10)=3(11)。

3.’^’符號,x^y,會將兩個十進制數在二進制下進行異或運算,然后返回其十進制下的值。例如3(11)^2(10)=1(01)。

4.’<<’符號,左移操作,x<<2,將x在二進制下的每一位向左移動兩位,最右邊用0填充,x<<2相當於讓x乘以4。相應的,’>>’是右移操作,x>>1相當於給x/2,去掉x二進制下的最有一位。

這四種運算在狀壓dp中有着廣泛的應用,常見的應用如下:

1.判斷一個數字x二進制下第i位是不是等於1。

方法:if ( ( ( 1 << ( i - 1 ) ) & x ) > 0)

將1左移i-1位,相當於制造了一個只有第i位上是1,其他位上都是0的二進制數。然后與x做與運算,如果結果>0,說明x第i位上是1,反之則是0。

2.將一個數字x二進制下第i位更改成1。

方法:x = x | ( 1<<(i-1) )

證明方法與1類似,此處不再重復證明。

3.把一個數字二進制下最靠右的第一個1去掉。

方法:x=x&(x-1)

晚上看了下白書上的旅行商的問題,針對狀態要用集合表示的問題,我們考慮用狀壓來處理。書上用了一個記憶話搜索來處理,今天先簡單入個門明天后天可以開始干題目了。

4.把一個數字二進制下第i位置0

方法: x=x&~(1<<(i-1))


免責聲明!

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



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