传送门

题意:

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]相关推荐

  1. bzoj1194 [HNOI2006]潘多拉的盒子

    http://www.elijahqi.win/archives/3189 Description 传说中,有个神奇的潘多拉宝盒.如果谁能打开,便可以拥有幸福.财富.爱情.可是直到真的打开,才发现与之 ...

  2. HNOI2006 潘多拉的盒子

    题目描述 题解: 题目的描述比较长,理解起来也有一定难度.仔细读题后我们发现整个任务可以分成两个部分:找出咒语机之间所有的升级关系.求最长升级序列. 1. 求升级关系: 容易看出,咒语机i可以抽象成一 ...

  3. 【BZOJ-1194】潘多拉的盒子 拓扑排序 + DP

    1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 456  Solved: 215 [Submit][St ...

  4. 第16章 潘多拉的盒子

    在分班后的高二上半学期的期末,孙斌新忽然不想上学了,想去当兵.我们不明白是什么导致他会有这样的想法.是因为高中的压力吗,还是适应不了这炼狱般的生活呢?我们不知道,知道的只是孙斌新在期末考完回家的路上, ...

  5. 专访李开复:人类已打开潘多拉盒子,封堵AI变革只会徒劳

    来源:人工智能学家 本文约3623字,建议阅读6分钟. 我们对李开复进行了专访,谈到了众多当前AI领域最受关注的话题. 摘要:近期,李开复新书<AI·未来>在美国同样反响不俗.在荣登多个排 ...

  6. IEEE专访李开复:人类已打开潘多拉盒子,封堵AI变革只会徒劳

    原作 :<IEEE Spectrum>  量子位 转载 | 公众号 QbitAI 近期,李开复新书<AI·未来>在美国同样反响不俗. 在荣登多个排行榜后,IEEE旗下<I ...

  7. 微软获 OpenAI 独家 GPT-3 模型授权,是潘多拉还是聚宝盆?

    作者 | 八宝粥 出品 | 程序人生(ID:coder_life) 9 月 20 日,微软宣布与 OpenAI 达成合作协议,得到了目前最火的 GPT-3 语言模型的独家授权,微软 CTO Kevin ...

  8. 谁打开了便携笔记本的潘多拉盒子

    自从华硕推出Eee PC,HP.Acer.DELL都在近期推出自己的便携笔记本,有人将便携笔记本定位为超低价笔记本,其实便携笔记本与低价笔记本是两个概念,如果只论低价,国内神州笔记本电脑并不一定高过华 ...

  9. 初露锋芒的AI战斗机,打开AI军备竞赛的潘多拉盒子

    作者|海怪 出品|脑极体 不久前,美国国防部高级研究计划局(DARPA)的ACE计划资助的一项名为"阿尔法狗斗"(AlphaDogfight Trials)的VR模拟人机对抗赛中, ...

最新文章

  1. 关于 synchronizeOnSession
  2. Ubuntu下修改DNS重启也能用的方法
  3. python生成器yield原理_生成器yield关键字详解
  4. mysql 8 centos_CentOS8下安装mysql8
  5. docker安装mysql后怎么链接_使用docker安装mysql并连接
  6. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1053:最大数输出
  7. SAP Marketing Cloud的几大核心模块讲解
  8. Redis五种数据类型详解
  9. Web安全开发注意事项
  10. padodb time.inc.php,怎样实现PHP中ADODB事务处理
  11. windows 临界区
  12. 轻松搞定个人虚拟桌面部署之4-配置远程访问
  13. tlwr886n发挥最大网速_路由器中的2.4G和5G有什么区别?用错了网速变“龟速”
  14. 【大讲堂讲师专访】张甦:数据库选型需因地制宜,MongoDB与MySQL绝非替代
  15. lua怎么嵌入php,Linux下安装PHP的lua扩展库
  16. JavaScript上传图片方式
  17. Mac版本git下载和使用
  18. MySQL和Navicat基本使用
  19. 2023计算机毕业设计SSM最新选题之java住院病人管理系统pebfh
  20. 扒开思派健康招股书:大数据的面子,“卖药”的里子

热门文章

  1. 【Git】ubuntu上git commit提交后如何保存和退出类似vim的界面,回到命令行
  2. java 线程通讯_java多线程(五)线程通讯
  3. java exception用法_JavaException的使用
  4. java控制台两个字符串_java控制台输入字符串
  5. 什么叫安装文件索引服务器,搜出精彩 玩转Windows 2008系统心得
  6. C语言——冒泡法排序应用
  7. HashSet中的add()方法( 四 )(详尽版)
  8. Vue mixins(混入) 附代码示例详解
  9. create-react-app my-app 报错解决方法
  10. Dispatch 执行ABC任务,执行完成之后刷新UI,指定任务D