UVA 11825 集合列舉 狀態壓縮 dp

2021-06-20 23:25:28 字數 881 閱讀 1070

列舉子集的飄逸寫法

這個裡面先處理出來選擇某台計算機可以覆蓋到的計算機的範圍。

選擇某個計算機集合可以覆蓋到的計算機的範圍

dp[s] 代表選擇某個計算機集合,最多可以覆蓋多少次全集。

dp[s]=max(dp[s],dp[s0^s]+1) s0 是s 的子集,s0^s 是s0 在 s 中的補集。

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define read freopen("acm.in","r",stdin)

#define write freopen("acm.out","w",stdout)

#define ll long long

#define pii pair#define pdi pair#define pdd pair#define mii map::iterator

#define fst first

#define sec second

#define ms(x,d) memset(x,d,sizeof(x))

#define inf 0x3f3f3f3f

#define all(x) x.begin(),x.end()

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define max 500000

#define root 0,n-1,1

#define pb push_back

#define for(a,b,c) for(int a=b;a

UVA 11825 狀壓 子集列舉

題意 給你若干個集合,讓你把這些集合做劃分使的每個劃分的並集是乙個全集,問你最多能進行多少個劃分。思路 首先了解下子集列舉的方法 for int i s i i i 1 i 1使得末尾最右邊的1右邊的0變成1,自己變成0,然後經過與運算把不存在的1刪掉,原來是0的位無論如何也不會變成1,但是原來是1...

UVA11825 狀壓DP 黑客的攻擊

題目大意 把n個集合p1,p2,p3,pn分成盡量多組,使得每組中所有集合的並集等於全集 考慮狀壓dp,p i 表示i集合,cover i 表示若干集合的並集,不難預處理出cover i 那麼dp方程就很好想了,f s max f s s0 s0為s的子集,且cover s0 全集 1,這裡再次用到...

對於UVa12096「集合的集合」的理解

這裡為每個集合分配了乙個唯一的 id,使用了 std map 實現集合到整數型別的對應。map 中的集合屬於物件型別,起初難以接受,不過既然是模板,那麼什麼型別都是可以裝載的。函式 id 起到了從 set 到 int 的轉換,並且新增了新家入的集合和整數id的對映以及id到集合的訪問 int id ...