二進位制狀態壓縮 應用及例題

2022-07-21 05:09:11 字數 1286 閱讀 6403

1.位運算:

符號描述

運算規則&與

兩個位都為1時,結果才為1|或

兩個位都為0時,結果才為0^異或

兩個位相同為0,相異為1~取反

0變1,1變0

<<

左移各二進位全部左移若干位,高位丟棄,低位補0

>>

右移各二進位全部右移若干位,對無符號數,高位補0,有符號數,各編譯器處理方法不一樣,有的補符號位(算術右移),有的補0(邏輯右移)

tips:

(1)&與相當於求交集操作,|相當於求並集操作

(2)位運算中的& | 不同於判斷條件中的與和或,也就是if中的條件句要寫成a&&b 或 a||b

(3)注意運算的優先順序:不知道優先順序就加括號就行!優先順序:

2.狀壓操作:

(1)取出整數n在二進位制表示下的第k位:(n>>k)&1,將n右移k位得到第k位的數值

(2)取出整數n在二進位制表示下的第0~k-1位:n&((1<(3)把整數n的第k為取反:n^(1<0,如果為0,0xor1=1,0->1;

(4)把n的第k位賦成1:n|(1<(5)把n的第k位賦成0:n&(~(1<(6)判斷n中是否有連續的1:(n&(n<<1))||(n&(n>>1)) 分別左移右移判斷有無真!

(7)查詢n中的第i位是0or1:n&(1<(8)將n直接按為取反(保留原有的位數不變): n^=((1<3.例題:最短hamilton路徑

給定一張n個節點的帶權無向圖,點從0到n-1編號,要求從0到n-1的最短的hamilton路徑。hamilton路徑指的是從0道n-1不重不漏地經過每乙個點恰好一次

brute_force?列舉n個點的全排列,按照給定排列嘗試,複雜度:o(n*n!)

可以用狀壓dp壓縮到o(n*2^n)

首先,我們如何表示那些節點已經經過,而那些節點還未被經過?我們可以用乙個n位的二進位制數表示!對於每一位,如果為0則表示尚未經過,1則表示這一位下的節點已經經過了

在任意時刻我們還需要知道當前所在的位置,因此設f[i][j]表示當前經過路徑資訊為i時,當前位置到j的最短hamilton路徑。其中i∈[0,2^n-1],j∈[1,n]

在起點0處時,初始化f[1][0]=0;對於剩下所有的狀態,初始化為乙個極大值,目標結果是f[2^n-1][n-1]

我們可以得到轉移方程:f[i][j]=min{f[i^(1《其中條件是:(i&(1<>j)&1=1 且k屬於[0,n] 因為j恰好被經過一次,所以一定是有上乙個沒有j的狀態中轉移過來的,則上乙個狀態的j位應該被賦值為0.同時上一時刻所處的位置是

i xor (1<

二進位制狀態壓縮

二進位制狀態壓縮,即將乙個長度為m的bool陣列用乙個m位的二進位制數來表示和儲存 操作運算 取出整數n在二進位制表示下的第k位 n k 1 取出整數n在二進位制表示下的第0 k 1位 後 k 位 n 1 取出整數n在二進位制表示下的第k位取反 n xor 1 取出整數n在二進位制表示下的第k位賦值...

Sleep Buddies (二進位制狀態壓縮)

演算法 狀態壓縮,把每乙個集合都壓縮成乙個數字。使用方法 把每個狀態都進行1 ac code 1 include 2 using namespace std 3 typedef long long ll 4 const int maxn 1e5 10 5 define rep i,first,las...

總結 二進位制狀態壓縮

目錄 二 二進位制狀態壓縮的操作 三 具體應用 1.定義 二進位制狀態壓縮,是指將乙個長度為 m 的 bool 型別陣列用乙個二進位制下有 m 位的整數表示並儲存的方法。2.應用範圍 二進位制狀態壓縮是狀態壓縮動態規劃,寬度優先搜尋狀態壓縮優化的重要基礎。我們在構建程式時一定要注意 在 m 位二進位...