UVA 11825 狀壓 子集列舉

2021-09-09 08:32:50 字數 653 閱讀 1353

題意:給你若干個集合,讓你把這些集合做劃分使的每個劃分的並集是乙個全集,問你最多能進行多少個劃分。

思路:首先了解下子集列舉的方法

for (int i = s; i; i = (i - 1) &s)
i - 1使得末尾最右邊的1右邊的0變成1,自己變成0,然後經過與運算把不存在的1刪掉,原來是0的位無論如何也不會變成1,但是原來是1的位就形成了不斷-1的模式。

有了這個前置技能,這題就變簡單了。首先用乙個p陣列狀壓每個子集能得到的狀態。再用s陣列表示每個劃分方式能得到的狀態。

然後列舉全部狀態s的子集s0,f[s]=max(f[s],f[s^s0]+1)。

#include using namespace std;

typedef long long ll;

int p[105];int b[1<<16];int f[1<<16];

int main()

} for(int s=0;s<(1<}

} f[0]=0;

int all=(1

printf("case %d: %d\n", cas++, f[all]);

} return 0;

}

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,這裡再次用到...

UVA 11825 集合列舉 狀態壓縮 dp

列舉子集的飄逸寫法 這個裡面先處理出來選擇某台計算機可以覆蓋到的計算機的範圍。選擇某個計算機集合可以覆蓋到的計算機的範圍 dp s 代表選擇某個計算機集合,最多可以覆蓋多少次全集。dp s max dp s dp s0 s 1 s0 是s 的子集,s0 s 是s0 在 s 中的補集。include ...

動態規劃 習題 光棍組織(狀壓 列舉子集)

題目描述 mm 雖然一輩子只要乙個,但是也得早點解決。於是,n 個光棍們自發組成了乙個光棍組織 ruffian organization,by wind 亂譯 現在,光棍們打算分成幾個小組,並且分頭為 找 mm 事 業做貢獻 for example searching,hunting by wind...