總結 二進位制狀態壓縮

2022-08-22 04:03:16 字數 1781 閱讀 2116

目錄

二、二進位制狀態壓縮的操作

三、具體應用

1.定義

二進位制狀態壓縮,是指將乙個長度為\(m\)的\(bool\)型別陣列用乙個二進位制下有\(m\)位的整數表示並儲存的方法。

2.應用範圍

二進位制狀態壓縮是狀態壓縮動態規劃寬度優先搜尋狀態壓縮優化的重要基礎。

我們在構建程式時一定要注意:

在\(m\)位二進位制數中,最低位為第0位,從右到左位數依次增加,最高位為\(m-1\)位。

邏輯運算子,算術運算子存在優先順序關係,如果不確定它們的優先順序,建議增添( )來保證程式的正確性。

運算子的優先順序如下表所示:

二進位制狀態壓縮的操作如下表所示:

當\(m\)較大時,我們還可以使用c++stl中的\(bitset\)實現:(定義乙個長度為1000的二進位制串n)

\[bitset<1000> n

\]例1:最短hamilton路徑

1. 題目描述:

給定一張n個點的無向圖,求起點0~(n-1)的最短hamilton路徑。

hamilton路徑的定義是恰好完全經過從起點0到終點\(n-1\)的所有點一次。

2.輸入樣例:

4

0 2 1 3

2 0 2 1

1 2 0 1

3 1 1 0

3. 分析:我們要求最短hamilton路徑,因此我們需要列舉所有的hamilton路徑,即這n個點的全排列,並計算該路徑的長度。這種做法的時間複雜度是\(o(n\times n!)\)。

繼續分析可以知道,我們需要記錄哪些點已經走過,哪些點還沒有走過。因為\(n\le 20\),所以我們可以採用狀壓dp來描述這個狀態。\(f(sta,i)\)表示當前點為\(i\),所有點走過狀態\(sta\)時的最短路徑長度。

轉移方程的初始狀態為\(f(1,0)=0\),表示僅經過了起點0,結束狀態為\(f((1

轉移方程為:\(f(sta,i)=min(f(sta,i),f(sta~~xor~~(1

因為\(i\)只會經過一次,所以當\(i\)走過時一定是上一次剛剛經過的。當然,\(i\)也可以經過\(k\)而到達的,我們列舉所有的\(i\),\(k\)並取最小值。

4. **如下:

#includeusing namespace std;

int n,val[22][22],f[1<<22][22];

int main()

return val;

}int main()

int ori=0,ans=0;

for(int pos=30;pos>=0;pos--){

int re0=calc_val(pos,0),re1=calc_val(pos,1);

//re0為選擇0後得到的答案,re1同理

if(ori+(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...

線段樹(狀態壓縮二進位制)

題意 給出n 1e5 的長度的木棒,初始的顏色都為1,給出顏色種類t 1 t 30 給出q 1e5 個操作,c l r x 將l到r內的所有顏色更改為x p l r 問在l到r內有多少種顏色。解法 觀察發現顏色種類不多,將顏色轉為二進位制,每一位代表一種顏色,1表示有改顏色。用線段樹儲存下當前的每一...