UVA11825 狀壓DP 黑客的攻擊

2021-07-24 08:14:25 字數 526 閱讀 6791

題目大意

把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,這裡再次用到子集的列舉

for (int s0=s;s;s0=(s0-1)&s)

還有就是這個演算法的複雜度是n3

,不過我分析不來,先留坑在這裡

#include

#include

#include

using

namespace

std;

const

int maxn=16;

int n,kase,p[maxn],cover[1

<1

int main()

return

0;}

UVA 11825 狀壓 子集列舉

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

UVA 11825 集合列舉 狀態壓縮 dp

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

NKOI 3720 UVA 11825 黑客的攻擊

題目描述 假設假設你是乙個黑客,侵入了乙個有著n臺計算機 編號0,1,n 1 的網路。一共有n種服務,每台計算機都執行著所有服務。對於每台計算機,你都可以選擇一項服務,終止這台計算機和所有與它相鄰計算機的該項服務 如果其中一些服務已經停止,則這些服務繼續處於停止狀態 你的目標是讓盡量多的服務完全癱瘓...