日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UVA11825 黑客的攻击 Hackers' Crackdown 状压DP,二进制,子集枚举

發(fā)布時(shí)間:2025/5/22 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVA11825 黑客的攻击 Hackers' Crackdown 状压DP,二进制,子集枚举 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。