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表示没有消去 ...
随机推荐
- php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明
php有一款插件叫做imagemagick,功能很强大,提供了图片的很多操作,图片剪切.压缩.合并.插入文本.背景色透明等.并且有api方法调用和命令行操作两种方式,如果只是简单处理的话建议api方法 ...
- ASP.NET Core Web 资源打包与压缩
本文将介绍使用的打包和压缩的优点,以及如何在ASP.NET Core应用程序中使用这些功能. 概述 在ASP.Net中可以使用打包与压缩这两种技术来提高Web应用程序页面加载的性能.通过减少从服务器请 ...
- 恐怖的ifdown eth0;0
下午闲的蛋疼,随手给测试机配了个浮动地址eth0:0. ping了下OK,内网访问没问题. 准备收手的时候,瞄了一眼ifcfg-eth0:0的配置,发现广播地址BROADCAST写成了BOADCAST ...
- NewsServiceImpl
package com.pb.news.service.impl; import java.util.List; import com.pb.news.dao.NewsDao;import com.p ...
- 第2篇:用as3.0制作一个滚动条组件
本实例演示了实现一个滚动条基本功能的制作方法,没有添加改变皮肤,修改滚动条视框大小等功能,有兴趣的朋友可根据自己要求自行添加.使用时只需要通过以下一行代码创建滚动条组件: var myScrollba ...
- 为Dynamics 365写一个简单程序实现解决方案一键迁移
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复258或者20170627可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...
- js 设置下拉框的默认值
设置下拉框的默认值,直接在option中增加selected就可以了.但是现在要使用JS来设置它的默认值,代码如下: <select name="aaa" id=" ...
- 利用workbench将excel数据导入到MySQL中
数据导入的方式(csv,txt之类) 在MySQL中,数据导入的方式有两种方式 通过第三方客户端导入(workbench) 通过mysql client 方式导入 通过mysql clinet的导入方 ...
- Sublime Text中安装插件来实现px与rem间的换算
今天在群里无意中看到了群友分享的一篇关于移动端的文章.里面其他内容我倒不大感兴趣,反而是rem让我提起了兴趣. 首先来谈一下rem,rem是CSS3中新增加的一个单位值,它和em单位一样,都是一个相对 ...
- 关于移动APP与Web APP的测试重点以及区别
Web app测试重点: 1. 功能测试:功能的实现是否满足需求. 2. 性能测试: 2.1 链接速度测试:测试页面链接的速度 2.2 负载测试:web应用系统能允许多少个用户同时在线?超过这个数量会 ...