【状压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))^St)中牛的数量}

#include<cstdio>
#include<bitset>
#include<algorithm>
using namespace std;
bitset<1000>vs[15],t,t2;
int n,m,K,ans,f[1<<15];
int main()
{
//  freopen("bzoj1688.in","r",stdin);
    int x,y;
    scanf("%d%d%d",&n,&m,&K);
    for(int i=1;i<=n;++i)
      {
        scanf("%d",&x);
        if(!x) ++f[0];
        for(int j=1;j<=x;++j)
          {
            scanf("%d",&y);
            vs[y-1][i-1]=1;
          }
      }
    for(int i=0;i<(1<<m);++i)
      for(int j=0;j<m;++j)
        if(!((1<<j)&i))
          {
            t.reset();
            for(int k=0;k<m;++k)
              if((!((1<<k)&i))&&k!=j)
                t|=vs[k];
            f[i|(1<<j)]=max(f[i|(1<<j)],f[i]+(int)((t|vs[j])^t).count());
          }
    for(int i=0;i<(1<<m);++i)
      {
        int cnt=0;
        for(int j=0;j<m;++j)
          if((1<<j)&i)
            ++cnt;
        if(cnt<=K)
          ans=max(ans,f[i]);
      }
    printf("%d\n",ans);
    return 0;
}
时间: 2024-10-01 04:48:27

【状压dp】【bitset】bzoj1688 [Usaco2005 Open]Disease Manangement 疾病管理的相关文章

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

思路:状压dp,枚举疾病的集合,然后判断一下可行性即可. #include<bits/stdc++.h> using namespace std; #define maxs 400000 #define maxn 1900 int n,d,k; int a[maxn],f[maxs],num[maxs]; int main(){ scanf("%d%d%d",&n,&d,&k); for (int i=1;i<(1<<d);i++)

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

1688: [Usaco2005 Open]Disease Manangement 疾病管理 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 413  Solved: 275[Submit][Status][Discuss] Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the farm. Farmer John woul

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

题目 1688: [Usaco2005 Open]Disease Manangement 疾病管理 Time Limit: 5 Sec  Memory Limit: 64 MB 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 <

bzoj1087 互不侵犯King 状压dp+bitset

题目传送门 题目大意:中文题面. 思路:又是格子,n又只有9,所以肯定是状压dp,很明显上面一行的摆放位置会影响下一行,所以先预处理出怎样的二进制摆放法可以放在上下相邻的两行,这里推荐使用bitset,否则会比较麻烦.然后dp的数组是f[ i ][ x ][ j ],表示第i行已经放置了x个国王,第 i 行的状态是 j .同时预处理出对于每一种二进制位,可以增加几个国王,计做cnt[ j ],所以得到 if(mp[ s ][ j ]) f[ i +1 ][x +cnt[ j ]][ j ]+=f

COdeforces#417D Cunning Gena(状压DP)

A boy named Gena really wants to get to the "Russian Code Cup" finals, or at least get a t-shirt. But the offered problems are too complex, so he made an arrangement with his n friends that they will solve the problems for him. The participants

CodeForces 757D Felicity&#39;s Big Secret Revealed(状压DP)

题意:给定一个01串,一个有效的n切割定义如下:一个横杠代表一次切割,第一条横杠前面的01串不算,最后一条横杠后面的01串不算,将两个横杠中的01串转化成十进制数字,假设这些数字的最大值是MAX且这些数字囊括了1-MAX的所有数字,则称为一次有效切割.求2~n+1次有效切割的切法. 思路: 由于题目要求包含所有1-MAXN的数字,且n<=75,所以MAXN<=20.另dp[i][j]表示第i位前面有一个横杆且存在j这个状态,接着从第i位开始枚举到第j位为下一个横杆的位置,设这两段横杆之间的数字

HDU 1565&amp;1569 方格取数系列(状压DP或者最大流)

方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6206    Accepted Submission(s): 1975 Problem Description 给你一个m*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的

POJ3254 状压dp

          Corn Fields Time Limit: 2000MS   Memory Limit: 65536K       Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yummy corn for the cows on a

poj 3254 Corn Fields 状压dp入门

// poj3254 状压dp入门 // dp[i][S]表示前i行第i行状态为S时放牧的情况 // S为十进制的二进制数形式如5为101表示第一列和第三列放牧的方法数 // 首先dp[0][S]合法的话就是1 // 状态转移方程为dp[i][S] = sigma(dp[i-1][V])(S与V是合法状态) // 最后的结果就是dp[n][S](S为所有的合法状态) // // 刚开始十分傻x的dp[0][S]置为get(S),...get(S)是其中1的个数 // 这又不是求放羊的数量,这是方