狀態壓縮 DP 學習筆記

2021-07-27 02:25:12 字數 1329 閱讀 8436

對於乙個全集 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=

子集 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

=

為什麼要 an

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行種植,最後一...