目錄
二、二進位制狀態壓縮的操作
三、具體應用
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表示有改顏色。用線段樹儲存下當前的每一...