壓縮dp用到了二進位制位運算上的東西,整理一下基本內容。
位運算的幾個基本操作:
1、移位(<< >>)
2、按位與(&)
3、按位或(|)
4、非(~)
5、異或(&)
每個都很簡單,c++上都學過,難的實在那幾個巧妙的利用上。
1、判斷乙個數二進位制下第i位是0或1 (x & (1<<(i-1)))>0
1<<(i-1)構造出來(...100...)(後面i-1個0),與x做與運算;由於其他位都是0,故相當於只有第i位在做與運算,而構造出來的為1,所以相當於只判斷x的第i位。同理,可用(3<<(i-1))、(5<<(i-1))...判斷x的連續幾位。
2、把x的第i位改為1 x=(x |(1<<(i-1)))
同上。3、把x的第i位改為0 x=(x & ~(1<<(i-1)))
~(1<<(i-1))相當於構造出來(111101111)(只有第i位為0)的數,做與運算第i位一定為0.
4、把x二進位制下最靠右的第乙個1去掉 x=(x & (x-1))
狀態壓縮DP之位運算總結
介紹 在進行dp題目分析時,針對狀態或子狀態可以抽象為 0 1 排列組合的題目時,將其 0 1 序列轉化為二進位制數,再而轉換為十進位制數,可以更加便捷的對其進行資料分析處理,減少因為混亂所造成的一些不必要的錯誤。魔鬼往往藏在細節之中。常用運算子 都是十進位制數在二進位制下所做的運算,返回十進位制的...
zoj 2297 DP 位運算狀態壓縮
越來越覺得位運算好神啊。用位運算來儲存每個狀態 include include include include include include include include include include include include include include include includ...
DP 亂搞 位運算
今天的題都這麼。這道題後面會用到逆推。首先得判斷是否有合法方案。而且方案明顯會有很多種,但只需要統計算到這一位時答案有多少個1。設f i j 表示算完i位時,答案裡有j個1.考慮轉移,轉移時對答案產生影響的還有兩位間1位置的交集,也就是f i j a i 1 後1的個數,設它為k。交集中1個數就是 ...