/**
题目:hdu6006 Engineer Assignment
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6006
题意:已知n个工程,每个需要某些领域的专家。有m个工程师,每个人擅长一些领域。 m<=10
一个工程师只能参加一个工程。一个工程可以多个工程师参加。
如果参加某个工程的工程师他们擅长的领域覆盖了该工程需要的领域。那么该工程可以执行。
问最多可以执行多少个工程。
思路:
定义dp[i][s]表示前i个工程状态为s可以执行的最大工程数。s表示前i个工人选走了s状态的工程师。
dp[i][s] = max(dp[i][s],dp[i-1][s']+1); s'为s的子集,且f[i][s-s'] = 1; 表示i这个工程,分配s-s'的工程师,可以完成。 */ #include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 2e5+;
const int inf = 0x3f3f3f3f;
vector<int> pro[], eng[];
map<int,int> mp;
int f[][<<];
int mv[];
int rm[<<];
int n, m;
int dp[][<<];
void init()
{
mv[] = ;
for(int i = ; i <= m; i++){
int s = ;
for(int j = ; j < eng[i].size(); j++){
s |= <<(mp[eng[i][j]]-);
}
mv[i] = s;
}
int len = (<<m);
rm[] = ;
for(int i = ; i < len; i++){
rm[i] = ;
for(int j = ; j <= m; j++){
if(i&(<<(j-))){
rm[i] |= mv[j];
}
}
} memset(f, , sizeof f);
for(int i = ; i <= n; i++){
int s1 = ;
for(int j = ; j < pro[i].size(); j++){
if(mp[pro[i][j]]==){
s1 = ; break;
}
s1 |= <<(mp[pro[i][j]]-);
}
if(s1==) continue;
for(int j = ; j < len; j++){
if((rm[j]&s1)==s1){
f[i][j] = ;
}
}
}
}
int main()
{
int cas = , T;
cin>>T;
while(T--)
{
scanf("%d%d",&n,&m);
int num, x;
for(int i = ; i <= n; i++){
scanf("%d",&num);
pro[i].clear();
for(int j = ; j <= num; j++){
scanf("%d",&x);
pro[i].push_back(x);
}
} mp.clear();
int cnt = ;
for(int i = ; i <= m; i++){
scanf("%d",&num);
eng[i].clear();
for(int j = ; j <= num; j++){
scanf("%d",&x);
eng[i].push_back(x);
if(mp[x]==){
mp[x] = cnt++;
}
}
}
int len = (<<m);
init();
int now = ;
for(int i= ; i < len; i++) dp[][i] = ;
for(int i = ; i <= n; i++){
now ^= ;
for(int s = ; s < len; s++){
dp[now][s] = dp[now^][s];///根据定义,所以传递。
if(f[i][s]==) continue;
for(int s0 = s; s0; s0 = (s0-)&s){
if(f[i][s0])
dp[now][s] = max(dp[now][s],dp[now^][s-s0]+);
}
}
}
printf("Case #%d: %d\n",cas++,dp[now][len-]);
}
return ;
}

hdu6006 Engineer Assignment 状态dp 定义dp[i][s]表示前i个工程状态为s可以执行的最大工程数。s表示前i个工人选走了s状态的工程师。的更多相关文章

  1. HDU 6006 Engineer Assignment:状压dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6006 题意: 在Google中,有个n项目,m个专家.第i个项目涉及c[i]个领域,分别为a[i][0 ...

  2. 【HDU 6006】Engineer Assignment(状压DP)

    Problem Description In Google, there are many experts of different areas. For example, MapReduce exp ...

  3. HDU6006:Engineer Assignment(状压DP)

    传送门 题意 给出n个工程,m个工程师,每个工程和工程师需要/拥有若干个技能,询问能够完成的最大工程个数,每个工程师用一次 分析 dp[i][j]表示前i个工程用的工程师集合为j的最大工程个数,那么有 ...

  4. Engineer Assignment(暴力+状压dp)

    题意: n个工程,m个研究员,每个工程需要Ci个领域(X1,X2..Xci)的研究员 ,每个研究员会Di个不同的领域(X1,X2..Xdi),要完成一个工程必须使得分配给这个工程的研究员覆盖了这个工程 ...

  5. Educational Codeforces Round 62 E 局部dp + 定义状态取消后效性

    https://codeforces.com/contest/1140/problem/E 局部dp + 定义状态取消后效性 题意 给你一个某些位置可以改变的字符串,假如字符串存在回文子串,那么这个字 ...

  6. Educational Codeforces Round 59 (Rated for Div. 2) E 区间dp + 状态定义 + dp预处理(分步dp)

    https://codeforces.com/contest/1107/problem/E 题意 给出01字符串s(n<=100),相邻且相同的字符可以同时消去,一次性消去i个字符的分数是\(a ...

  7. hdu 6006 Engineer Assignment 状压dp

    Engineer Assignment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  8. hdu 4649 Professor Tian 反状态压缩+概率DP

    思路:反状态压缩——把数据转换成20位的01来进行运算 因为只有20位,而且&,|,^都不会进位,那么一位一位地看,每一位不是0就是1,这样求出每一位是1的概率,再乘以该位的十进制数,累加,就 ...

  9. HDU 4739 Zhuge Liang's Mines (状态压缩+背包DP)

    题意 给定平面直角坐标系内的N(N <= 20)个点,每四个点构成一个正方形可以消去,问最多可以消去几个点. 思路 比赛的时候暴力dfs+O(n^4)枚举写过了--无意间看到有题解用状压DP(这 ...

随机推荐

  1. Android之通知使用权

    通知使用权打开方式 设置--提示音和通知--通知使用权. 具体界面如图: 存在须要拥有通知使用权应用时: 不存在须要拥有通知使用权应用时: 用户为应用勾选复选框后系统弹dialog须要用户进一步确认时 ...

  2. java程序计算数独游戏

    兴趣来了,写了个简单的数独游戏计算程序,未做算法优化. 通过文件来输入一个二维数组,9行,每行9个数组,数独游戏中需要填空的地方用0来表示.结果也是打印二维数组. import java.io.Fil ...

  3. 转: APK签名校验绕过

    转: http://drops.wooyun.org/mobile/4296 APK签名校验绕过 3xpl0it · 2014/12/11 10:41 0x01 Android签名机制 将APK重命名 ...

  4. 有关﹤![CDATA[ ]]> 说明

    CDATA DTD中的属性类型 全名:character data 在标记CDATA下,所有的标记.实体引用都被忽略,而被XML处理程序一视同仁地当做字符数据看待, CDATA的形式如下: <! ...

  5. vue - 实例事件

    1.$on(在构造器外部添加事件) 2.$once(执行一次的事件) 3.$off(关闭事件) 4.$emit(事件调用) <!DOCTYPE html> <html lang=&q ...

  6. Android 8.0新特性-取消大部分静态注册广播

    今天楼主在写一个广播的demo,功能非常的简单,就是一个应用发送一个自定义的广播,同时在这个应用里面定义了一个广播接受者,并且在AndroidManifest文件中进行静态的注册.Demo看上去非常的 ...

  7. Unity Mono foreach BUG性能测试

    # 环境 - Unity 4.6.4 / Windows # 测试代码 # 结果数据 # 结论 foreach存在bug,会导致GC,并且效率低下: 使用GetEnumerator代替,没有GC,并且 ...

  8. python学习准备阶段(环境配置)python解释器的选择

    pycharm提示No Python interpreter configgured for the project ####### 1 点击configure python interpreter ...

  9. ES6 对象转Map

    使用Object.entries const obj = { foo: 'bar', baz: 42 }; const map = new Map(Object.entries(obj)); map ...

  10. Python爬虫碎碎念

    最近领导给了一个任务,从单位的数据库里面导出所有的数据,存到本地excel表格.我就想,这不挺简单的么,给我数据库的密码账户,几条语句搞定. 结果让人大失所望,单位数据库只能通过后台管理系统查看,平台 ...