Hackers' Crackdown UVA - 11825 (状压dp)
给出n个电脑,每个电脑连着n个服务,然后每个电脑都连着m个邻电脑,如果当前的电脑某个服务被断开了,相邻的电脑的服务也会被断开,每个电脑都只能操作一次,问你最多可以让多少种服务被断开。一种服务被断开的条件就是存在一个破坏第i个电脑的集合,这个集合扩散出去的集合是全集(......语文真的是......讲不出来)
先把每个电脑和邻电脑的状态记录下来,把这个看成一个集合,然后那么我现在的问题就变成了用一些电脑的集合并起来使他变成全集。
现在把n个电脑的可能状态全部枚举出来,然后看当前这些电脑最多可以影响多少电脑,把这种状态记录下来,然后在开始dp
dp[电脑的所有可能状态] = 当前状态可以获得的最大方案数
所以我现在可以枚举破坏电脑的状态,然后去找这个状态的子集,如果我的子集可以影响的范围是全集的话,那么我的dp状态就是dp[i] = max(dp[i], dp[i^j]+1),表示我可能从补集+1或者自己原本的最大值。
#include<map>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x & (-x)) typedef unsigned long long int ull;
typedef long long int ll;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = << ;
const int maxm = ;
const int mod = ;
using namespace std; int n, m, tol;
int dp[maxn];
int state[maxn];
int num[]; void init() {
memset(dp, , sizeof dp);
memset(num, , sizeof num);
memset(state, , sizeof state);
} int main() {
int cas = ;
while(scanf("%d", &n), n) {
init();
for(int i=; i<n; i++) {
num[i] = << i;
scanf("%d", &m);
while(m--) {
int tmp;
scanf("%d", &tmp);
num[i] |= ( << tmp);
}
}
tol = << n;
for(int i=; i<tol; i++) {
state[i] = ;
for(int j=; j<n; j++) {
if(i & ( << j)) {
state[i] |= num[j];
}
}
}
for(int i=; i<tol; i++) {
for(int j=i; j; j=(j-) & i) {
if(state[j] == tol - ) {
dp[i] = max(dp[i], dp[i^j] + );
}
}
}
printf("Case %d: %d\n", cas++, dp[tol-]);
}
return ;
}
Hackers' Crackdown UVA - 11825 (状压dp)的更多相关文章
- UVa 11825 (状压DP) Hackers' Crackdown
这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...
- Hackers' Crackdown( UVA UVA 11825状压dp)
题意:N台电脑,现在有N种服务,现在你可以在每台电脑终止一项服务,他和他相邻的电脑都会被关闭,如果一项服务在所有电脑都没运行,该项服务成功被破坏,问最多能破坏几种服务. 分析:把n个集合分成尽量多组, ...
- UVA - 11825 状压DP
该题目是EMAXX推荐的练习题,刘汝佳的书也有解说 如果S0属于全集,那S0就可以作为一个分组,那么S分组数可以是best{当前S中S0的补集+1} 对于集合类的题目我觉得有点抽象,希望多做多理解把 ...
- UVA - 10817 状压DP
题意:大白P95 本题比较特别的是状压两个集合并且进行转移,因此要分别处理当前集合只有1个老师/2个老师的记录(然后可O(1)得出0个老师的集合) 记忆化过了但是迭代式不能记忆超过2的之前的状态是怎样 ...
- Hackers' Crackdown UVA - 11825
Miracle Corporations has a number of system services running in a distributed computer system which ...
- UVa 1252 (状压DP + 记忆化搜索) Twenty Questions
题意: 有n个长为m的各不相同的二进制数(允许存在前导0),别人已经事先想好n个数中的一个数W,你要猜出这个数. 每次只可以询问该数的第K为是否为1. 问采用最优询问策略,则最少需要询问多少次能保证猜 ...
- UVa 10817 (状压DP + 记忆化搜索) Headmaster's Headache
题意: 一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师. 每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两 ...
- UVA - 11795 状压DP
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #i ...
- UVa 11795 状压DP Mega Man's Mission
kill[S]表示消灭机器人的集合为S,剩下的所能杀死的机器人集合. 设d(S)表示杀死机器人集合为S的方法数,答案为d((1<<n) - 1). d(S)可以由d(S')转移过来,其中S ...
随机推荐
- WPF 添加 Resources Dictionary 资源 一般类库项目中无法添加资源文件(ResourceDictionary)
在文件夹或者项目右键-> Add(添加),会弹出可以快捷添加的资源,但是你会发现没有 ResourceDictionary资源可以选择. 解决此问题方法: 第一步:工程->右键->U ...
- activemq配置安装
1.了解JMS查看百度百科 https://baike.baidu.com/item/JMS/2836691?fr=aladdin 2.了解ActiveMQ https://baike.baidu.c ...
- React-组件的生命周期详解(含React16版本)
在一个组件的整个生命周期中,通过用户的交互来更新state或者props,重新渲染组件,更新页面的ui.组成一个简单的"状态机". react的生命周期三个阶段: Mounting ...
- linux查看硬盘占用情况
Linux命令 : df -hl 使用后文件系统 容量 已用 可用 已用% 挂载点Filesystem Size Used Avail Use% Mounted on/dev/vda1 197G 5. ...
- WPF:浅析Dispatcher
本人文笔差.还是直接上代码吧.(本文假设你对WPF中的Dispatcher有一定的了解) 你觉得下面的代码可以正常执行吗? private void Button_Click(object sende ...
- SpringMVC归纳-2(Session会话、拦截器)
要点: 1.HttpSession:一个session的建立是从一个用户向服务器发第一个请求开始,而以用户显式结束或session超时为结束,借助session能在一定时间内记录用户状态. 2.Mod ...
- [转载]——说说IO
本文转载自"和你在一起"的"说说IO"系列文章https://pengjiaheng.iteye.com/,总共分为8篇,特意整理.收录在此,支持原创.尊重原创 ...
- About A Scam
事件起因 本篇记录一个我遇到一个诈骗故事. 这两年我陆续有收到邮件,内容为有一大笔遗产我可以继承,让我提供银行卡号,身份证号相关信息. 后面邮件的内容就变为,有一笔公益款项,可以用我名义去管理,让我提 ...
- 初步了解PE分析
尝试编写代码获取PE文件的信息. 首先使用 CreateFile打开一个PE文件并返回一个用于访问该对象的handle. HANDLE CreateFile( LPCTSTR lpFileName, ...
- Windows下Oracle 11g的安装
Windows下Oracle 11g的安装 Windows下Oracle 11g的安装: Windows:64位, Oracle 11g版本:win64_11gR2_database_1of2(安装包 ...