Disease Manangement 疾病管理
 

Description

Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the farm. Farmer John would like to milk as many of his N (1 <= N <= 1,000) cows as possible. If the milked cows carry more than K (1 <= K <= D) different diseases among them, then the milk will be too contaminated and will have to be discarded in its entirety. Please help determine the largest number of cows FJ can milk without having to discard the milk.

Input

* Line 1: Three space-separated integers: N, D, and K * Lines 2..N+1: Line i+1 describes the diseases of cow i with a list of 1 or more space-separated integers. The first integer, d_i, is the count of cow i’s diseases; the next d_i integers enumerate the actual diseases. Of course, the list is empty if d_i is 0. 有N头牛,它们可能患有D种病,现在从这些牛中选出若干头来,但选出来的牛患病的集合中不过超过K种病.

Output

* Line 1: M, the maximum number of cows which can be milked.

Sample Input 1

6 3 2
0———第一头牛患0种病
1 1——第二头牛患一种病,为第一种病.
1 2
1 3
2 2 1
2 2 1

Sample Output 1

5
OUTPUT DETAILS:
If FJ milks cows 1, 2, 3, 5, and 6, then the milk will have only two
diseases (#1 and #2), which is no greater than K (2).

Source

[BZOJ1688][Usaco2005 Open]

只是稍微接触过一点状压dp,没有一点思路。

首先预处理出 num[i] 表示状态i有几种病,用a[i]存每头牛的状态。

然后dp[i] 表示状态为i的最多牛数

那么转移方程为 dp[s] = max(dp[s] , dp[S] + 1); 其中s=a[i] | S;

 #include<bits/stdc++.h>
using namespace std;
const int maxn=; const int M=<<;
int a[maxn],num[M],dp[M];
int main() {
for(int i=;i<M;i++) num[i]=num[i>>]+(i&);
int n,m,k;
while(~scanf("%d%d%d",&n,&m,&k)) {
memset(a,,sizeof(a));
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++) {
int x;
scanf("%d",&x);
while(x--) {
int val;
scanf("%d",&val);
a[i]|=<<(val-);//将第val位变为1
}
}
for(int i=;i<=n;i++) {
for(int S=(<<m)-;S>=;S--) {//枚举状态
int s=a[i]|S;//由S可以到达的状态s
if(num[s]>k) continue;
dp[s]=max(dp[s],dp[S]+);//那么s壮态数量 就可能更新
}
}
int ans=-;
for(int i=;i<M;i++) {
if(num[i]>k) continue;
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
}
}

#include<bits/stdc++.h>using namespace std;const int maxn=1010;
const int M=1<<15;int a[maxn],num[M],dp[M];int main() {    for(int i=0;i<M;i++) num[i]=num[i>>1]+(i&1);    int n,m,k;    while(~scanf("%d%d%d",&n,&m,&k)) {        memset(a,0,sizeof(a));        memset(dp,0,sizeof(dp));        for(int i=1;i<=n;i++) {            int x;            scanf("%d",&x);            while(x--) {                int val;                scanf("%d",&val);                a[i]|=1<<(val-1);//将第val位变为1            }        }        for(int i=1;i<=n;i++) {            for(int S=(1<<m)-1;S>=0;S--) {//枚举状态                int s=a[i]|S;//由S可以到达的状态s                if(num[s]>k) continue;                dp[s]=max(dp[s],dp[S]+1);//那么s壮态数量 就可能更新            }        }        int ans=-1;        for(int i=0;i<M;i++) {            if(num[i]>k) continue;            ans=max(ans,dp[i]);        }        printf("%d\n",ans);    }}

BZOJ1688 Disease Manangement 疾病管理的更多相关文章

  1. 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP

    [BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...

  2. 1688: [Usaco2005 Open]Disease Manangement 疾病管理( 枚举 )

    我一开始写了个状压dp..然后没有滚动就MLE了... 其实这道题直接暴力就行了... 2^15枚举每个状态, 然后检查每头牛是否能被选中, 这样是O( 2^15*1000 ), 也是和dp一样的时间 ...

  3. 1688: [Usaco2005 Open]Disease Manangement 疾病管理

    1688: [Usaco2005 Open]Disease Manangement 疾病管理 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 413  So ...

  4. 【状压dp】【bitset】bzoj1688 [Usaco2005 Open]Disease Manangement 疾病管理

    vs(i)表示患i这种疾病的牛的集合. f(S)表示S集合的病被多少头牛患了. 枚举不在S中的疾病i,把除了i和S之外的所有病的牛集合记作St. f(S|i)=max{f(S)+((St|vs(i)) ...

  5. bzoj1688: [Usaco2005 Open]Disease Manangement 疾病管理

    思路:状压dp,枚举疾病的集合,然后判断一下可行性即可. #include<bits/stdc++.h> using namespace std; #define maxs 400000 ...

  6. [Usaco2005 Open]Disease Manangement 疾病管理 BZOJ1688

    分析: 这个题的状压DP还是比较裸的,考虑将疾病状压,得到DP方程:F[S]为疾病状态为S时的最多奶牛数量,F[S]=max{f[s]+1}; 记得预处理出每个状态下疾病数是多少... 附上代码: # ...

  7. 【bzoj1688】[USACO2005 Open]Disease Manangement 疾病管理

    题目描述 Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the farm. Far ...

  8. 【bzoj1688】[USACO2005 Open]Disease Manangement 疾病管理 状态压缩dp+背包dp

    题目描述 Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the farm. Far ...

  9. BZOJ 1688: [Usaco2005 Open]Disease Manangement 疾病管理

    Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the fa ...

随机推荐

  1. IIS “另一个程序正在使用此文件,进程无法访问"

    重启iis,提示"另一个程序正在使用此文件,进程无法访问".一开始就怀疑是80端口被占用,修改iis的端口为其它端口,重启iis, 果然成功. 在命令行,netstat -nabo ...

  2. Spring 注解 整理

    首先 在xml中配置 xmlns:context="http://www.springframework.org/schema/context" http://www.spring ...

  3. 在Lua中封装一个调试日志(附lua时间格式)

    --自己封装一个Debug调试日志 Debug={} Info={} local function writeMsgToFile(filepath,msg) end function Debug.Lo ...

  4. 使用jasmine-node 进行NodeJs单元测试 环境搭建

    关于jasmine就不多说了,关于语法请参加官方文档.http://pivotal.github.io/jasmine/ 关于NodeJS的单元测试框架有多种,如果要在NodeJS中使用jasmine ...

  5. jmeter 读取多个用户名并同时发

    在运营活动测试过程中,经常需要对秒杀活动或定时抽奖活动进行并发测试.那么怎样快速便捷的模拟多用户同时参与活动,抽取奖品,进行并发测试呢?尤其是,当奖品总数N<用户总数M时,代码是否会存在奖品多发 ...

  6. Java锁---偏向锁、轻量级锁、自旋锁、重量级锁

    之前做过一个测试,反复执行过多次,发现结果是一样的: 1. 单线程下synchronized效率最高(当时感觉它的效率应该是最差才对): 2. AtomicInteger效率最不稳定,不同并发情况下表 ...

  7. CodeForces 327E Axis Walking(状压DP+卡常技巧)

    Iahub wants to meet his girlfriend Iahubina. They both live in Ox axis (the horizontal axis). Iahub ...

  8. HTML中的内容总结

    一.URL编码类型 对于Get方法,参数是直接通过URL传递的,那这个参数又是根据什么进行编码的呢?对于JSP网页,这个编码是通过第一句描述: <%@ page language="j ...

  9. Android-Activity横竖屏切换不杀死Activity 并监听横竖屏切换

    在上一篇博客,Android-Activity临时数据的保存,中讲解到,当发生横竖屏切换的时候,系统会杀死Activity并重新启动Activity 系统会杀死Activity 12-12 08:11 ...

  10. js 操作cookie cookie路径问题

    这里主要不是讲这个方法,js写cookie这种代码网上一抓一把,在使用的时候遇到一点问题,就是写的cookie 是有路径问题的,在user目录下可以使用跳转到另外一个目录下cookie,经过比较coo ...