對於乙個全集 u=
的任意乙個子集 a⊆
u ,我們可以用乙個n位的二進位制數來表示這乙個集合。其中,末位第
i 位數為
0表示 ai
不存在於該子集中,為
1 表示 ai
存在於該子集中。
例如:
全集 u=那麼我們可以用子集 a=
(10101)2
來表示子集
a 。
對於全集
u的任意兩個子集
a 、
b的二進位制表示分別為
a 、b,有
a∩可以發現,集合的交/並/補集運算是符合位運算的特點的。b=a an
d
b a∪
b=ao
r
b ∁u
a=(n
ota)
and
u
例如:
全集 u=為什麼要 an子集 a
=
子集 b
= a∪
b=a or
b=(00101)2
or(01010)2
=(01111)2
=a∩b
=aand
b=(00101)2
and(
01010)2
=(00000)2
=∅∁ua
=(no
t a)
=not(
00101)2
=(11010)2
=
d 一下
u 呢?因為在計算機中整形變數往往不止你需要的二進位制位數,如果不an
d一下
u 則會在高位上產生很多不必要的 1
「狀態壓縮 dp 」指記錄當前集合的狀態,在集合上進行轉移的dp。
在一些問題上,我們通常需要儲存高維(四、五維以上),而且狀態的範圍很低(一般為存在和不存在兩種),此時開高維陣列的常數會呈幾何倍數增加,這時我們就要用「狀態壓縮」來把多層狀態壓成乙個整數。壓縮狀態的方式有很多,我們常用的就是「以集合的形式儲存狀態」。
「狀態壓縮dp」一般用於解決無已知多項式演算法的np完全問題(如旅行商問題)。由於需要列舉集合,所以它的複雜度是指數級別的,一般為o(
2n) 及其倍數或乘方。儘管如此,一般搜尋演算法動輒 o(
n!) 的複雜度比「狀態壓縮 dp 」高到不知道**去了。
正在施工中
學習筆記 狀態壓縮DP
我們知道,用dp解決乙個問題的時候很重要的一環就是狀態的表示,一般來說,乙個陣列即可儲存狀態。但是有這樣的一些題 目,它們具有dp問題的特性,但是狀態中所包含的資訊過多,如果要用陣列來儲存狀態的話需要四維以上的陣列。於是,我們就需要通過狀態壓縮來儲存狀態,而 使用狀態壓縮來儲存狀態的dp就叫做狀態壓...
狀態壓縮DP
首先,我們以一道狀壓經典題tsp來引入。tsp問題 一張圖上有n個點,給定相應的鄰接矩陣,需要求出從0號節點出發,經過且只經過每個頂點一次,最後仍回到0號節點的最小邊權。思路 假設現在已訪問過的頂點集合 起點0當作還未訪問過的頂點 為s,當前所在頂點為v,用dp s v 表示從v出發訪問剩餘的所有頂...
狀態壓縮DP
theme 給定乙個n m的玉公尺田,1 n,m 12。值為0表示不能在該塊種草,為1表示可以。現在要在其上中若干草地,要求任意草地間不相鄰 沒有公共邊 問不考慮草地個數的情況下,有多少種種植的方案?solution 用dp。又範圍很小,所以考慮狀態壓縮dp,另dp i j 表示從前i行種植,最後一...