UVA11825 黑客的攻击 Hackers' Crackdown 状压DP,二进制,子集枚举
題目鏈接Click Here
【題目描述】
假如你是一個(gè)黑客,侵入了一個(gè)有著\(n\)臺(tái)計(jì)算機(jī)(編號(hào)為\(1.2.3....n\))的網(wǎng)絡(luò)。一共有\(n\)種服務(wù),每臺(tái)計(jì)算機(jī)都運(yùn)行著所有服務(wù)。對(duì)于每臺(tái)計(jì)算機(jī),你都可以選擇一項(xiàng)服務(wù),終止這臺(tái)計(jì)算機(jī)和所有與它相鄰計(jì)算機(jī)的該項(xiàng)服務(wù)(如果其中一些服務(wù)已經(jīng)停止,那他們繼續(xù)保持停止?fàn)顟B(tài))。你的目標(biāo)是讓盡量多的服務(wù)完全癱瘓(即:沒有任何計(jì)算及運(yùn)行著該服務(wù))
【輸入格式】
輸入包含多組數(shù)據(jù),每組數(shù)據(jù)的第一行為整數(shù)\(n(1<=n<=16)\):以下\(n\)行每行描述一臺(tái)計(jì)算機(jī)相鄰的計(jì)算機(jī),其中第一個(gè)數(shù)\(m\)為相鄰計(jì)算機(jī)個(gè)數(shù),接下來的\(m\)個(gè)整數(shù)為這些計(jì)算機(jī)的編號(hào)。輸入結(jié)束標(biāo)志\(n=0\)。
【輸出格式】
對(duì)于每組數(shù)據(jù),輸出完全癱瘓的服務(wù)的數(shù)量。
本題實(shí)際上可以轉(zhuǎn)化為:給你\(n\)個(gè)集合\(p_{1 -> n}\),你要把它們分成盡可能多的組,每個(gè)組內(nèi)所有集合的并等于全集。
因?yàn)?span id="ozvdkddzhkzd" class="math inline">\(n\)比較小,所以我們可以把每個(gè)集合\(P\)(每個(gè)點(diǎn)自身\(+\)它相鄰的點(diǎn))二進(jìn)制狀壓。考慮選取一些集合時(shí),把選取的集合也二進(jìn)制狀壓(表示為\(S\)),存一下該選取狀態(tài)下可以覆蓋的狀況即可(\(cover_s\))。
這樣我們可以得到方程:
\[f(S) = max (f(S - S_0)|S_0∈S, cover_{S_0} = S_{All})\]
技巧:二進(jìn)制下的子集枚舉:
for (int S0 = S; S0 != 0; S0 = (S0 - 1) & S)這樣為什么能實(shí)現(xiàn)子集枚舉呢?請(qǐng)讀者自行思考(笑
復(fù)雜度:\(O(\sum_{k=1->N}C(n, k) * 2 ^ n) = O(3 ^ n)\)。為什么等于后面我不會(huì)二項(xiàng)式定理所以不大會(huì)。
關(guān)注點(diǎn):本題中的子集枚舉思想。
#include <bits/stdc++.h> using namespace std;const int N = 20;int Case, n, m, to, s[N], f[N], cho[1 << N];int main () { // freopen ("data.in", "r", stdin);while (cin >> n && n) {for (int i = 0; i < n; ++i) {cin >> m; s[i] = 1 << i;for (int j = 0; j < m; ++j) {cin >> to; s[i] |= 1 << to;} // cout << "s[" << i << "] = " << s[i] << endl;} const int All = (1 << n) - 1;for (int i = 0; i < 1 << n; ++i) {cho[i] = 0;for (int k = 0; k < n; ++k) {if ((i >> k) & 1) {cho[i] |= s[k];}}}f[0] = 0;for (int S = 1; S < (1 << n); ++S) {f[S] = 0;for (int S0 = S; S0; S0 = (S0 - 1) & S) { //枚舉S的子集 if (cho[S0] == All) {f[S] = max (f[S], f[S ^ S0] + 1);}}}cout << "Case " << ++Case << ": " << f[All] << endl;} }轉(zhuǎn)載于:https://www.cnblogs.com/maomao9173/p/10688004.html
總結(jié)
以上是生活随笔為你收集整理的UVA11825 黑客的攻击 Hackers' Crackdown 状压DP,二进制,子集枚举的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux目录2
- 下一篇: LeetCode 之 JavaScrip