HDU 6006 Engineer Assignment:状压dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6006
题意:
在Google中,有个n项目,m个专家。第i个项目涉及c[i]个领域,分别为a[i][0]...a[i][c[i]-1]。第i个专家精通d[i]个领域,分别为b[i][0]...b[i][d[i]-1]。
如果要完成一个项目,则这个项目所涉及到的每一个领域都必须至少有一个精通该领域的专家。你作为director,可以任意分配专家,但一个专家只能去做一个项目。问你最多能够完成多少个项目。
题解:
首先表示状态:
当前考虑到第i个项目,专家的状态为state(每一位上0表示还没选,1表示已经选过了),在这之前最多能完成dp个项目。
即:dp[i][state] = max num of finished pros
如何转移:
对于第i个项目,可以做或不做。
(1)如果不做,则专家的状态state没有变化。
dp[i+1][state] = max(dp[i+1][state], dp[i][state])
(2)如果做,则首先要满足在剩下的专家中,有一些人能够完全覆盖到这个项目所涉及的领域。设这个项目可以选择的专家的方案为nex(每一位0代表不选,1代表选)。那么转移为:
if(!(state&nex)) dp[i+1][state|nex] = max(dp[i+1][state|nex], dp[i][state] + 1)
Tips:先预处理出每个项目合法的选专家的方案,存到vector中。
求dp:先枚举第i个项目,再枚举此时的状态,做或不做两种情况分别处理。
AC Code:
// dp[i][state] = max num of finished pros
// dp[i+1][state|nex] = max self and dp[i][state] + 1
// preprocess: the sequence of selected experts for each pros
// a state on exps is legal only if state_exp & state_now == 0 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX_N 15
#define MAX_C 5
#define MAX_A 105
#define MAX_S (1<<12) using namespace std; int n,m,t;
int cas=;
int ans;
int a[MAX_N][MAX_C];
int b[MAX_N][MAX_C];
int c[MAX_N];
int d[MAX_N];
bool pro[MAX_N][MAX_A];
bool exp[MAX_N][MAX_A];
int dp[MAX_N][MAX_S];
vector<int> transfer[MAX_N]; void read()
{
memset(pro,false,sizeof(pro));
memset(exp,false,sizeof(exp));
cin>>n>>m;
for(int i=;i<n;i++)
{
cin>>c[i];
for(int j=;j<c[i];j++)
{
cin>>a[i][j];
pro[i][a[i][j]]=true;
}
}
for(int i=;i<m;i++)
{
cin>>d[i];
for(int j=;j<d[i];j++)
{
cin>>b[i][j];
exp[i][b[i][j]]=true;
}
}
} bool check(int k,int state)
{
for(int i=;i<c[k];i++)
{
int ned=a[k][i];
bool flag=false;
for(int j=;j<m;j++)
{
if(((state>>j)&) && exp[j][ned])
{
flag=true;
break;
}
}
if(!flag) return false;
}
return true;
} void cal_exp()
{
for(int i=;i<n;i++)
{
transfer[i].clear();
for(int state=;state<(<<m);state++)
{
if(check(i,state)) transfer[i].push_back(state);
}
}
} void cal_dp()
{
memset(dp,,sizeof(dp));
ans=;
for(int i=;i<n;i++)
{
for(int state=;state<(<<m);state++)
{
dp[i+][state]=max(dp[i+][state],dp[i][state]);
for(int j=;j<transfer[i].size();j++)
{
int nex=transfer[i][j];
if(!(state&nex))
{
dp[i+][state|nex]=max(dp[i+][state|nex],dp[i][state]+);
}
}
}
}
} void solve()
{
cal_exp();
cal_dp();
for(int state=;state<(<<m);state++)
{
ans=max(ans,dp[n][state]);
}
} void print()
{
cout<<"Case #"<<(++cas)<<": "<<ans<<endl;
} int main()
{
cin>>t;
while(t--)
{
read();
solve();
print();
}
}
HDU 6006 Engineer Assignment:状压dp的更多相关文章
- hdu 6006 Engineer Assignment 状压dp
Engineer Assignment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- HDU - 6006 Engineer Assignment (状压dfs)
题意:n个工作,m个人完成,每个工作有ci个阶段,一个人只能选择一种工作完成,可以不选,且只能完成该工作中与自身标号相同的工作阶段,问最多能完成几种工作. 分析: 1.如果一个工作中的某个工作阶段没有 ...
- HDU6006:Engineer Assignment(状压DP)
传送门 题意 给出n个工程,m个工程师,每个工程和工程师需要/拥有若干个技能,询问能够完成的最大工程个数,每个工程师用一次 分析 dp[i][j]表示前i个工程用的工程师集合为j的最大工程个数,那么有 ...
- hdu 3247 AC自动+状压dp+bfs处理
Resource Archiver Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Ot ...
- hdu 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 5765 Bonds(状压DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...
- hdu 3681(bfs+二分+状压dp判断)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 思路:机器人从出发点出发要求走过所有的Y,因为点很少,所以就能想到经典的TSP问题.首先bfs预 ...
- hdu 4778 Gems Fight! 状压dp
转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...
- hdu 4856 Tunnels (bfs + 状压dp)
题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...
- HDU 4272 LianLianKan (状压DP+DFS)题解
思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...
随机推荐
- 在线SVN仓库实现:金山快盘+TortoiseSVN(Win)+SCPlugin(Mac)
前段时间一直在研究SVN在线托管,也尝试了网上推荐的免费托管网站. 但毕竟是是免费的,还是要受到比如空间大小.私有性等这样那样的限制,感觉有些麻烦. 而且,比较心疼自己在本地开发的时候积累的更新日志, ...
- Socket实现-Socket I/O
Socket层的核心是两个函数:sosend()和soreceive().这两个函数负责处理所有Socket层和协议层之间的I/O操作. select()系统调用的作用是监控文件描述符的状态.一般用于 ...
- Linux的同步访问技术
1.中断屏蔽: 单CPU范围内避免竞态的一种简单方法:在进入临界区之前屏蔽系统的中断.中断屏蔽将使得中断与进程之间的并发不再发生,而且Linux内核的进程调度等操作都依赖中断来实现,内核抢占式进程之间 ...
- Flask+uwsgi+Nginx+Ubuntu部署
学了一段时间flask,可是一直没有做过部署, 于是想着怎么部署呢, 想想,先吧服务给搞通吧,于是呢 就先想着去吧服务给搞起来,这里选择的是Flask+uwsgi+Nginx+Ubuntu, Pyth ...
- JQuery EasyUI的常用组件
jQuery EasyUI 是一个基于 jQuery 的框架,集成了各种用户界面插件,该框架提供了创建网页所需的一切,帮助您轻松建立站点. 注:本次介绍的JQuery EasyUI版本为1.5版. 一 ...
- dashDB - Creating a table with CLOB column type
In order to create a table with clob column type, the table has to be created with "ORGANIZE BY ...
- 百度云bcc建站
一.购买百度云服务 1.百度云bcc购买网页http://bce.baidu.com/product/bcc.html 2.买完后管理:http://console.bce.baidu.com/bcc ...
- ajax异步上传文件之data参数----小哈学js
下载ajaxFileUpload.js(下载网址:http://fileuploadajax.codeplex.com/downloads/get/20976) 修改ajaxFileUpload.js ...
- MySQL IO线程及相关参数调优
一.关于一个SQL的简单的工作过程 1.工作前提描述 1.启动MySQL,在内存中分配一个大空间innodb_buffer_pool(其中log_buffer) 2.多用户线程连接MySQL,从内存分 ...
- python基础(7):元祖类型(赋值补充)
前面学了列表和字典,今天我们看一个和列表相似的类型元祖. 预习: 简单购物车 实现打印商品详细信息,用户输入商品名和购买个数,则将商品名,价格,购买个数加入购物列表,如果输入为空或其他非法输入则要求用 ...