uva11825Hackers' Crackdown
2016-03-21 22:12
274 查看
链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18913
题意:《算法竞赛入门经典训练指南》算法设计基础例题29。
分析:刘汝佳讲得很好了,我就不bb了。需要学习的姿势是二进制集合子集的遍历。剩下就是状态压缩了。O(3^n)
代码:
#include<map> #include<set> #include<cmath> #include<queue> #include<bitset> #include<math.h> #include<cstdio> #include<vector> #include<string> #include<cstring> #include<iostream> #include<algorithm> #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; const int N=1000010; const int MAX=151; const int MOD1=1000007; const int MOD2=100000009; const double EPS=0.00000001; typedef long long ll; const ll MOD=1000000009; const ll INF=10000000010; typedef double db; typedef unsigned long long ull; int f[20],g[70010],dp[70010]; int main() { int i,j,n,a,x,ca=0; while (scanf("%d", &n)&&n) { memset(f,0,sizeof(f)); memset(g,0,sizeof(g)); for (i=0;i<n;i++) { scanf("%d", &a);f[i]|=1<<i; for (j=0;j<a;j++) { scanf("%d", &x); f[i]|=1<<x;f[x]|1<<i; } } for (i=0;i<1<<n;i++) for (j=0;j<n;j++) if (i&(1<<j)) g[i]|=f[j]; for (i=0;i<1<<n;i++) { dp[i]=0; for (j=i;j;j=(j-1)&i) if (g[j]==(1<<n)-1) dp[i]=max(dp[i],dp[i^j]+1); } printf("Case %d: %d\n", ++ca, dp[(1<<n)-1]); } return 0; }
相关文章推荐
- 编写c#程序,输出平均分和高于平均分的同学
- 基本标签(一)
- [教程] 从png到ico
- stdlib 头文件
- 10 条有趣的 Linux 命令
- HDOJ 5645 DZY Loves Balls
- hdoj RPG的错排 2068 (数学&错排公式)
- 用两个栈实现队列
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) A B C
- Java 8新特性探究(九)跟OOM:Permgen说再见吧
- Android中RecyclerView的使用
- 支持向量机理解
- Nginx的安装,启动,停止,日志分割,从容停止,平滑升级
- 按钮带动画效果(1)
- 数据库基础——事务
- 读程序
- OSI七层
- linux 基本命令 mkdir rm touh eho vi cat cp mv
- u-boot分析 四 (程序入口start.S)
- Git操作