Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

近期,农场出现了D (1<= D <=15)种细菌。John 要从他的 N (1<= N <=1,000)头奶牛中尽可能多地选些产奶。但是如果选中的奶牛携带了超过 K (1<= K <=D)种不同细菌,所

生产的奶就不合格。请你帮助John 计算出最多可以选择多少头奶牛。

【输入格式】

<第一行:三个整数 N, D, K

下面N行:第i行表示一头牛所携带的细菌情况。第一个整数 di 表示这头牛所携带的细菌种类数,后面di个整数表示这些细菌的各自种类标号。

【输出格式】

只一个数 M,最大可选奶牛数。

样例解释:

选择:

1,2,3,5,6

只有1#和2#两种细菌

Sample Input

6 3 2

0

1 1

1 2

1 3

2 2 1

2 2 1

Sample Output

5

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t045

【题意】

【题解】



设f[i][j]表示前i头牛,细菌的情况为j的选奶牛个数

如果选了第i头牛;

则状态变为j|a[i]

这里a[i]是第i头牛带细菌的情况转化为对应的二进制(有第i种细菌,对应的二进制位上的数字就为1->然后转成十进制);

然后预处理一下0..32768里面哪些状态的细菌个数是小于等于k的;

看看j|a[i]是不是细菌个数小于k;

然后进行转移就好;

f[i][j|a[i]]=max(f[i][j|a[i]],f[i-1][j]+1);//选第i头牛

f[i][j]=max(f[i][j],f[i-1][j]); //不选第i头牛

我都比较喜欢直观的顺推的。



【完整代码】

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cmath>
  4. using namespace std;
  5. #define lson l,m,rt<<1
  6. #define rson m+1,r,rt<<1|1
  7. #define LL long long
  8. #define rep1(i,a,b) for (int i = a;i <= b;i++)
  9. #define rep2(i,a,b) for (int i = a;i >= b;i--)
  10. #define mp make_pair
  11. #define pb push_back
  12. #define fi first
  13. #define se second
  14. #define rei(x) scanf("%d",&x)
  15. #define rel(x) scanf("%lld",&x)
  16. #define ref(x) scanf("%lf",&x)
  17. typedef pair<int, int> pii;
  18. typedef pair<LL, LL> pll;
  19. const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
  20. const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
  21. const double pi = acos(-1.0);
  22. const int N = 1100;
  23. int f[2][32768 + 100],a[N];
  24. int n, d, k,now,ans;
  25. bool can[32768 + 100];
  26. void in()
  27. {
  28. rei(n), rei(d), rei(k);
  29. rep1(i, 1, n)
  30. {
  31. int num;
  32. rei(num);
  33. rep1(j, 1, num)
  34. {
  35. int x;
  36. rei(x);
  37. a[i] |= 1 << (x-1);
  38. }
  39. }
  40. }
  41. void pre()
  42. {
  43. rep1(i, 0, 32768)
  44. {
  45. int x = i, cnt = 0;
  46. bool ju = true;
  47. while (x)
  48. {
  49. cnt += x & 1;
  50. x >>= 1;
  51. if (cnt > k)
  52. {
  53. ju = false;
  54. break;
  55. }
  56. }
  57. can[i] = ju;
  58. }
  59. }
  60. void do_dp()
  61. {
  62. now = 0;
  63. memset(f[now], 255, sizeof f[now]);
  64. f[now][0] = 0;
  65. rep1(i, 1, n)
  66. {
  67. now ^= 1;
  68. rep1(j, 0, 32768)
  69. f[now][j] = -1;
  70. rep1(j, 0, 32768)
  71. if (f[now ^ 1][j] != -1)
  72. {
  73. int k = j|a[i];
  74. if (can[k])
  75. f[now][k] = max(f[now][k], f[now ^ 1][j] + 1);
  76. f[now][j] = max(f[now][j], f[now ^ 1][j]);
  77. }
  78. }
  79. rep1(i, 0, 32768)
  80. ans = max(ans, f[now][i]);
  81. }
  82. void o()
  83. {
  84. printf("%d\n", ans);
  85. }
  86. int main()
  87. {
  88. //printf("%d\n", sizeof(f) / 1024 / 1024);
  89. //freopen("F:\\rush.txt", "r", stdin);
  90. in();
  91. pre();
  92. do_dp();
  93. o();
  94. //printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
  95. return 0;
  96. }

【t045】细菌的更多相关文章

  1. OpenJudge计算概论-细菌的战争

    /*====================================================================== 细菌的战争 总时间限制: 1000ms 内存限制: 6 ...

  2. POJ C程序设计进阶 编程题#5:细菌分组实验

    编程题#5:细菌实验分组 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 有 ...

  3. 细菌(disease)

    细菌(disease) 题目描述 近期,农场出现了D(1≤D≤15)种细菌.John要从他的N(1≤N≤1000)头奶牛中尽可能多地选些产奶,但是如果选中的奶牛携带了超过K(1≤K≤D)种不同细菌,所 ...

  4. 2712:细菌繁殖-poj

    2712:细菌繁殖 总时间限制:  1000ms 内存限制:  65536kB 描述 一种细菌的繁殖速度是每天成倍增长.例如:第一天有10个,第二天就变成20个,第三天变成40个,第四天变成80个,… ...

  5. 统计细菌基因组ORF

    提取细菌基因组ORF思路: 1.通过FNA文件得到细菌基因组序列 2.分正负链和三个相位共6种情况统计ORF 3.写入文件 转载请保留出处! 统计细菌基因组ORF 贴上Python代码(版本:3.6) ...

  6. 从细菌GFF文件提取CDS序列并转换为氨基酸序列

    最近在上生物信息学原理,打算记录一些课上的作业.第一次作业:如题. 基本思路: 1.从GFF中读取CDS的起始终止位置以及正负链信息.GFF格式见http://blog.sina.com.cn/s/b ...

  7. 【noip模拟赛5】细菌 状压dp

    [noip模拟赛5]细菌   描述 近期,农场出现了D(1<=D<=15)种细菌.John要从他的 N(1<=N<=1,000)头奶牛中尽可能多地选些产奶.但是如果选中的奶牛携 ...

  8. 【noip模拟赛5】细菌

    描述 近期,农场出现了D(1<=D<=15)种细菌.John要从他的 N(1<=N<=1,000)头奶牛中尽可能多地选些产奶.但是如果选中的奶牛携带了超过 K (1<=K ...

  9. 细菌多位点序列分型(Multilocus sequence typing,MLST)的原理及分型方法

    摘 要: 多位点序列分型(MLST)是一种基于核酸序列测定的细菌分型方法,通过PCR扩增多个管家基因内部片段,测定其序列,分析菌株的变异,从而进行分型.MLST被广泛应用于病原菌.环境菌和真核生物中. ...

随机推荐

  1. Android 获取联系人手机号码、姓名、地址、公司、邮箱、生日

    public void testGetAllContact() throws Throwable { //获取联系人信息的Uri Uri uri = ContactsContract.Contacts ...

  2. vue给对象新添加属性,一定要使用Vue.set( target, key, value )这个API来添加

    this.tagList = [{ id:1, tagName:'90后' }, { id:2, tagName:'土豪' }, { id:3, tagName:'美女' }, { id:4, tag ...

  3. Day2:字符串常用方法

    字符串常用方法 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wan name = "my \tname is ...

  4. Spring MVC学习总结(1)——Spring MVC单元测试

    关于spring MVC单元测试常规的方法则是启动WEB服务器,测试出错 ,停掉WEB 改代码,重启WEB,测试,大量的时间都浪费在WEB服务器的启动上,下面介绍个实用的方法,spring MVC单元 ...

  5. 洛谷——P2241 统计方形(数据加强版)

    https://www.luogu.org/problem/show?pid=2241 题目背景 1997年普及组第一题 题目描述 有一个n*m方格的棋盘,求其方格包含多少正方形.长方形 输入输出格式 ...

  6. NDIS

    NDIS NDIS(NetworkDriverInterfaceSpecification)是网络驱动程序接口规范的简称.它横跨传输层.网络层和数据 链路层,定义了网卡或网卡驱动程序与上层协议驱动程序 ...

  7. thinkphp3.1课程 1-2 thinkphp中入口文件的实质是什么

    thinkphp3.1课程 1-2 thinkphp中入口文件的实质是什么 一.总结 一句话总结:在thinkphp中,我们访问的始终是入口文件,并没有主动去访问任何一个其他文件,只不过在入口文件体内 ...

  8. 在此页上的 ActiveX 控件和本页上的其它部份的交互可能不安全

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息http://xqy266.blogbus.com/logs/66258230.html 在EOS6的项目中,如果采用VC++开发的Active ...

  9. ArcGIS IQueryFilter接口

    樱木  原文IQueryFilter 1.IQueryFilter::SubFields (1)默认值为“*”,即查询时返回整行数据,如果只需要某一个字段数据(比如“Country”字段),则可以指定 ...

  10. [Redis专辑][1]ubuntu12.04下安装php-redis的方法和步骤

    首次公布路径:phpredis的安装 非常久非常久没有写博文了,好多博文都没有整理完成,今天才抽时间整理完这一篇博文,希望能对大家有一定的帮助 首先对redis做个简单的介绍: Redis 是全然开源 ...