BZOJ 1194: [HNOI2006]潘多拉的盒子 [DP DFA]
传送门
题意:
s个DFA,选出尽量多的自动机a0, a1, a2, . . . , at,使得a1包含a0、a2包 含a1,以此类推。s ≤ 50。
DFA的字符集为{0,1},有的节点是输出源,节点数n ≤ 50。
判断出包含关系后就是裸的最长路,求$SCC$后$DP$就好了
重点在判断包含:
$n$实在太小了,我们直接枚举所有的自动机,然后两个同时从起点开始$bfs$所有情况看看是否在某个状态一个有输出另一个没有
复杂度$O(n^4)$
注意:
$Candy?$这个沙茶$bfs$没有判断$(0,0)$状态是否一个输出一个不输出$WA$了好久,并且他还有一次求$SCC$没有枚举所有点
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N=55; inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f; } int s,n,m; struct DFA{int n,m,p[N][2],out[N]; }a[N]; struct edge{int v,ne; }e[N*N<<1],e2[N*N<<1]; int h[N],cnt,h2[N],cnt2; inline void ins(int u,int v){//printf("ins %d %d %d\n",cnt,u,v);cnt++;e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt; } inline void ins2(int u,int v){//printf("ins2 %d %d\n",u,v);edge *e=e2;int *h=h2,&cnt=cnt2;cnt++;e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt; } struct node{int x,y;node(int a=0,int b=0):x(a),y(b){} }q[N*N]; int head,tail; bool vis[N][N]; void bfs(DFA &a,DFA &b,int i,int j){int a_b=1,b_a=1;memset(vis,0,sizeof(vis));head=tail=1;q[tail++]=node(0,0);vis[0][0]=1;while(head!=tail){node u=q[head++];int x=u.x , y=u.y;if(a.out[x]&&!b.out[y]) b_a=0;if(!a.out[x]&&b.out[y]) a_b=0;if(a_b==0&&b_a==0) break;for(int i=0;i<=1;i++){int nx=a.p[x][i],ny=b.p[y][i];if(!vis[nx][ny]){vis[nx][ny]=1;q[tail++]=node(nx,ny);}}}if(a_b==1) ins(i,j);else if(b_a==1) ins(j,i); } void buildGraph(){for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++) bfs(a[i],a[j],i,j); }int dfn[N],dfc,low[N],scc,belong[N]; int st[N],top; int val[N]; void dfs(int u){dfn[u]=low[u]=++dfc;st[++top]=u;for(int i=h[u];i;i=e[i].ne){int v=e[i].v;if(!dfn[v]){dfs(v);low[u]=min(low[u],low[v]);}else if(!belong[v])low[u]=min(low[u],dfn[v]);}if(dfn[u]==low[u]){scc++;while(true){int x=st[top--];belong[x]=scc;val[scc]++;if(x==u) break;}} } int f[N]; int dp(int u,int fa){if(f[u]) return f[u];for(int i=h2[u];i;i=e2[i].ne)if(e2[i].v!=fa) f[u]=max(f[u],dp(e2[i].v,u));return f[u]+=val[u]; } int main(){//freopen("in","r",stdin);n=read();for(int i=1;i<=n;i++){a[i].n=read();a[i].m=read();for(int j=1;j<=a[i].m;j++) a[i].out[read()]=1;for(int j=0;j<a[i].n;j++) a[i].p[j][0]=read(),a[i].p[j][1]=read();}buildGraph();for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i);for(int u=1;u<=n;u++)for(int i=h[u];i;i=e[i].ne) if(belong[u]!=belong[e[i].v]) ins2(belong[u],belong[e[i].v]);int ans=0;for(int i=1;i<=scc;i++) ans=max(ans,dp(i,0));printf("%d\n",ans); }
BZOJ 1194: [HNOI2006]潘多拉的盒子 [DP DFA]相关推荐
- bzoj1194 [HNOI2006]潘多拉的盒子
http://www.elijahqi.win/archives/3189 Description 传说中,有个神奇的潘多拉宝盒.如果谁能打开,便可以拥有幸福.财富.爱情.可是直到真的打开,才发现与之 ...
- HNOI2006 潘多拉的盒子
题目描述 题解: 题目的描述比较长,理解起来也有一定难度.仔细读题后我们发现整个任务可以分成两个部分:找出咒语机之间所有的升级关系.求最长升级序列. 1. 求升级关系: 容易看出,咒语机i可以抽象成一 ...
- 【BZOJ-1194】潘多拉的盒子 拓扑排序 + DP
1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 456 Solved: 215 [Submit][St ...
- 第16章 潘多拉的盒子
在分班后的高二上半学期的期末,孙斌新忽然不想上学了,想去当兵.我们不明白是什么导致他会有这样的想法.是因为高中的压力吗,还是适应不了这炼狱般的生活呢?我们不知道,知道的只是孙斌新在期末考完回家的路上, ...
- 专访李开复:人类已打开潘多拉盒子,封堵AI变革只会徒劳
来源:人工智能学家 本文约3623字,建议阅读6分钟. 我们对李开复进行了专访,谈到了众多当前AI领域最受关注的话题. 摘要:近期,李开复新书<AI·未来>在美国同样反响不俗.在荣登多个排 ...
- IEEE专访李开复:人类已打开潘多拉盒子,封堵AI变革只会徒劳
原作 :<IEEE Spectrum> 量子位 转载 | 公众号 QbitAI 近期,李开复新书<AI·未来>在美国同样反响不俗. 在荣登多个排行榜后,IEEE旗下<I ...
- 微软获 OpenAI 独家 GPT-3 模型授权,是潘多拉还是聚宝盆?
作者 | 八宝粥 出品 | 程序人生(ID:coder_life) 9 月 20 日,微软宣布与 OpenAI 达成合作协议,得到了目前最火的 GPT-3 语言模型的独家授权,微软 CTO Kevin ...
- 谁打开了便携笔记本的潘多拉盒子
自从华硕推出Eee PC,HP.Acer.DELL都在近期推出自己的便携笔记本,有人将便携笔记本定位为超低价笔记本,其实便携笔记本与低价笔记本是两个概念,如果只论低价,国内神州笔记本电脑并不一定高过华 ...
- 初露锋芒的AI战斗机,打开AI军备竞赛的潘多拉盒子
作者|海怪 出品|脑极体 不久前,美国国防部高级研究计划局(DARPA)的ACE计划资助的一项名为"阿尔法狗斗"(AlphaDogfight Trials)的VR模拟人机对抗赛中, ...
最新文章
- 关于 synchronizeOnSession
- Ubuntu下修改DNS重启也能用的方法
- python生成器yield原理_生成器yield关键字详解
- mysql 8 centos_CentOS8下安装mysql8
- docker安装mysql后怎么链接_使用docker安装mysql并连接
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1053:最大数输出
- SAP Marketing Cloud的几大核心模块讲解
- Redis五种数据类型详解
- Web安全开发注意事项
- padodb time.inc.php,怎样实现PHP中ADODB事务处理
- windows 临界区
- 轻松搞定个人虚拟桌面部署之4-配置远程访问
- tlwr886n发挥最大网速_路由器中的2.4G和5G有什么区别?用错了网速变“龟速”
- 【大讲堂讲师专访】张甦:数据库选型需因地制宜,MongoDB与MySQL绝非替代
- lua怎么嵌入php,Linux下安装PHP的lua扩展库
- JavaScript上传图片方式
- Mac版本git下载和使用
- MySQL和Navicat基本使用
- 2023计算机毕业设计SSM最新选题之java住院病人管理系统pebfh
- 扒开思派健康招股书:大数据的面子,“卖药”的里子
热门文章
- 【Git】ubuntu上git commit提交后如何保存和退出类似vim的界面,回到命令行
- java 线程通讯_java多线程(五)线程通讯
- java exception用法_JavaException的使用
- java控制台两个字符串_java控制台输入字符串
- 什么叫安装文件索引服务器,搜出精彩 玩转Windows 2008系统心得
- C语言——冒泡法排序应用
- HashSet中的add()方法( 四 )(详尽版)
- Vue mixins(混入) 附代码示例详解
- create-react-app my-app 报错解决方法
- Dispatch 执行ABC任务,执行完成之后刷新UI,指定任务D