
T1 疾病管理
裸得不能再裸的状压dp 不过数据范围骗人
考试时k==0的点没过 我也很无奈呀qwq
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<string> using namespace std; ],f[<<]; int pd(int x){ ; while (x){ ) tot++; x>>=; } return tot; } int main(){ freopen ("disease.in","r",stdin); freopen ("disease.out","w",stdout); ; scanf ("%d%d%d",&n,&d,&k); ;i<=n;++i){ int x,y; scanf ("%d",&x); ) sum++; ;j<=x;++j){ scanf ("%d",&y); g[i]|=(<<y-); } } ;i<(<<d);++i) { if (pd(i)<=k) ;j<=n;++j){ if (g[j]&(~(g[j]&i))) continue; //如果这个公牛的疾病未完全被包含在此状态中 就跳过 f[i]++; } } ; ;i<(<<d);++i) ans=max(ans,f[i]); ) ans=max(ans,sum); cout<<ans; ; }
T2 安排公牛
考场上玄学dfs胡乱搞到70
然而大家似乎都是随手就80了(无奈脸x2
看到<=20的友好范围想着要状压 然而 越想越复杂了(老毛病
正解依旧dp
要注意0也是一种状态 对 什么都不放也是一种状态qwq 大概就是类似于“无即万物“的思想
感谢超级厉害的csy大佬不嫌我蠢跟我讲了几遍
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<string> #define ll long long using namespace std; ][]; <<]; ; int main(){ freopen ("examnine.in","r",stdin); freopen ("examnine.out","w",stdout); scanf ("%d%d",&n,&m); ; ;i<=n;++i){ int xx,y; scanf ("%d",&xx); ;j<=xx;++j){ scanf ("%d",&y); x[i][y]=; } } dp[]=; ;i<=n;++i) <<m)-;j>=;--j){ if (!dp[j]) continue; ;k<=m;++k){ if (!x[i][k]) continue; <<k-)) continue; dp[j|(<<k-)]+=dp[j]; } dp[j]=; } ;i<=(<<m)-;++i) ans+=dp[i]; cout<<ans; ; }
总结:
以后碰到感觉不怎么好打的dp
一定要认真分析时间复杂度
敢于dfs(逃