我們可以使用乙個01串a來表示乙個集合。對於數x(x≥0),用ax=0表示它不在該集合中,用ax=1表示它在該集合中。
將01串a看作是乙個二進位制數,我們把它轉換為十進位制,就可以使用乙個十進位制整數來表示乙個實際使用二進位制方式表示的集合。
這樣,我們可以使用位運算方便地處理集合的操作。
·交集兩個集合a和b的交集,即為兩個集合公有元素的集合。這等價於兩個原始集合對應的二進位制整數的某一位同時為1,則所求集合該位為1。
用位運算描述,交集運算實質上就是與運算,即a∩b=a&b。
·並集兩個集合a和b的並集,即為兩個集合所有元素的集合。這等價於兩個原始集合對應的二進位制整數的某一位只要有乙個為1,則所求集合該位為1。
用位運算描述,並集運算實質上就是或運算,即a∪b=a|b。
·判斷包含關係
如果集合a是集合b的子集,那麼集合a的每乙個元素都屬於集合b。那麼,集合a與集合b的交集即為集合b,而它們的並集即為集合a。
用位運算描述,若(a&b)==b,則b⊆a(或若(a|b)==a,則b⊆a)。
·判斷屬於關係
設整數t=1《用位運算描述,若((1<·補集
若集合a是集合u的子集,那麼a在u中的補集為所有u中不屬於a的元素的集合。由於a中的元素必定存在於u中,這等價於不同時存在於a和u但至少存在於其中乙個集合的元素的集合,也就是異或運算的結果。
用位運算描述,若a⊆u,則cua=a^u。
·差集集合a與集合b的差集,即為屬於集合a但不屬於集合b的元素的集合。也就是說,我們從集合a中去掉同時屬於a和b的元素,得到的就是a與b的差集,即它們的交集在a中的補集。
用位運算描述,a-b=a^(a&b)。
·對稱差集
對於集合a與集合b,屬於a或屬於b,但不同時屬於a和b的元素構成的集合稱為它們的對稱差集。這也就是它們異或運算的結果。
用位運算描述,a△b=a^b。
·全集生成
若要研究的元素範圍在0~n之間,那麼全集u為11…1((n+1)個1)。如何生成這樣乙個集合呢?我們知道,對於整數t=1《用位運算描述,u=(1<·元素生成
直接列舉元素範圍0到n,判斷每乙個數是否是當前集合的元素即可。
·子集生成
直接列舉空集0到當前集合,判斷每乙個集合是否是當前集合的子集即可。
·標記為存在
將數x在集合a裡標記為存在,首先構造出只有該元素的集合,再取它們的並集。
用位運算描述,a|=1<·標記為不存在
將數x在集合a裡標記為存在,首先構造出只沒有該元素的集合,再取它們的交集。
用位運算描述,a&=~(1《狀態壓縮動態規劃,即狀壓dp,指的是把利用二進位制方式表示的集合當作狀態,在此基礎上進行的動態規劃。
·題目描述
現有n盞燈,以及m個按鈕。每個按鈕可以同時控制這n盞燈——按下了第i個按鈕,對於所有的燈都有乙個效果。按下i按鈕對於第j盞燈,是下面3中效果之一:如果a[i][j]為1,那麼當這盞燈開了的時候,把它關上,否則不管;如果為-1的話,如果這盞燈是關的,那麼把它開啟,否則也不管;如果是0,無論這燈是否開,都不管。
現在這些燈都是開的,給出所有開關對所有燈的控制效果,求問最少要按幾下按鈕才能全部關掉。
·題目分析
按下某乙個按鈕,則所有的燈都會改變,從當前的狀態改變為確定的另乙個狀態。對於從初始情況到這n盞燈的某乙個狀態,它的最小步數即為所有可能轉移到該狀態的狀態最小步數加上1。
因此,我們可以將使用二進位制方式表示的集合儲存乙個狀態。我們把燈編號為1~n-1,那麼,我們有狀態轉移方程f[a]=min+1(a為n盞燈的乙個狀態集合,t為可轉移到該狀態的乙個狀態集合),邊界條件為f[(1《實現的時候,對於每乙個狀態,列舉它可以到達的所有狀態,判斷是否可以轉移即可。
#include#include#includeusing namespace std;
const int maxn=10;
int n,m,f[(1<-1;--i)
for(int j=1;j<=m;++j)
狀態壓縮動態規劃
動態規劃的狀態有時候比較難,不容易表示出來,需要用一些編碼技術,把狀態壓縮的用簡單的方式表示出來。典型方式 當需要表示乙個集合有哪些元素時,往往利用2進製用乙個整數表示。一般有個資料 n 16 或者 n 32 這個很可能就是狀態dp的標誌,因為我們要用乙個int的二進位制來表示這些狀態。要注意好這些...
動態規劃 狀態壓縮
這個題目的題意很容易理解,在乙個n m的格仔裡,我們現在有兩種型別的磚塊,1 2和 2 1,問一共有多少種方案,可以將整個n m的空間都填滿。最簡單的例子就是下面的了 程式設計之美中題目 某年夏天,位於希格瑪大廈四層的微軟亞洲研究院對辦公樓的天井進行了一次大規模的裝修.原來的地板鋪有 n m 塊正方...
動態規劃之狀態壓縮
題目 是hdu 1074,題目大意是說 有幾門課的作業需要做,已知每門課作業的deadline和完成該作業需要花費的時間,求乙個作業的完成順序,使得最終的超時的天數最小。比如,現在如下輸入 computer 3 3 english 20 1 math 3 2 其中,第一列表示課程名,第二列表示dea...