/**
题目: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. @NotEmpty、@NotBlank、@NotNull区别

    @NotEmpty 用在集合类上面 @NotBlank 用在String上面 @NotNull    用在基本类型上

  2. (转)intellij idea svn 修改文件后,父文件夹也标注修改

    svn文件修改后,默认只有当前文件更改而父文件没有标注,很不直观:查了一顿后,发现,可以设置: File—->settings—->version control—–>勾选show ...

  3. 【翻译自mos文章】在11gR2 rac环境中,文件系统使用率紧张,而且lsof显示有非常多oraagent_oracle.l10 (deleted)

    在11gR2 rac环境中,文件系统使用率紧张.而且lsof显示有非常多oraagent_oracle.l10 (deleted) 參考原文: High Space Usage and "l ...

  4. The WebSocket Protocol

      [Docs] [txt|pdf] [draft-ietf-hybi-t...] [Diff1] [Diff2] [Errata] Updated by: 7936 PROPOSED STANDAR ...

  5. taro 自定义 轮播图组件

    1.代码 components/MySwiper/index.js /** * 轮播图组件 */ import Taro, { Component } from '@tarojs/taro'; imp ...

  6. git 关联远程分支

    问题解析: git本地新建一个分支后,必须要做远程分支关联.如果没有关联, git 会在下面的操作中提示你显示的添加关联.关联目的是如果在本地分支下操作: git pull, git push ,不需 ...

  7. Odoo8.0安装wkhtmltopdf报表运行环境

    #下载   #注意根据操作系统选择相应版本   (旧地址)wget http://sourceforge.net/projects/wkhtmltopdf/files/0.12.1/wkhtmltox ...

  8. CodeForces 390E Inna and Large Sweet Matrix(树状数组改段求段)

    树状数组仅仅能实现线段树区间改动和区间查询的功能,能够取代不须要lazy tag的线段树.且代码量和常数较小 首先定义一个数组 int c[N]; 并清空 memset(c, 0, sizeof c) ...

  9. js对数组按顺序排序

    console.log("------默认排序(ASCII字符排序)------"); ,,,,]; arr.sort(); //ASCII字符代码从小到大排序 console.l ...

  10. HTTP协议发展历史

    一.HTTP 0.9版本 1991年发布0.9版本,只有一个 GET 命令. 例如:GET /index.html   表示浏览器只能接收返回 html 格式的字符串:服务器发送完毕就关闭tcp链接. ...