[Usaco2005 Open]Disease Manangement 疾病管理 BZOJ1688
分析:
这个题的状压DP还是比较裸的,考虑将疾病状压,得到DP方程:F[S]为疾病状态为S时的最多奶牛数量,F[S]=max{f[s]+1};
记得预处理出每个状态下疾病数是多少...
附上代码:
#include <cstdio> #include <algorithm> #include <cmath> #include <cstdlib> #include <cstring> #include <queue> #include <iostream> using namespace std; #define N 1005 #define M 1<<15 int f[M],a[N],K,n,m,num[M]; int main() { for(int i=0;i<M;i++)num[i]=num[(i>>1)]+(i&1); scanf("%d%d%d",&n,&m,&K); for(int i=1;i<=n;i++) { int x; scanf("%d",&x); while(x--) { int y; scanf("%d",&y); a[i]|=1<<(y-1); } } for(int i=1;i<=n;i++) { for(int S=(1<<m)-1;S>=0;S--) { int s=a[i]|S; if(num[s]>K)continue; f[s]=max(f[s],f[S]+1); } } int ans=0; for(int i=0;i<M;i++) { if(num[i]>K)continue; ans=max(ans,f[i]); } printf("%d\n",ans); }