摘要:
常规做法是枚举每个字符串每个位置,时间复杂度O(n*len*len),(建字典树O(n*len))。 然而我看这题第一眼想的是时间复杂度O(n*len)的算法。。就是建正反两棵字典树,每个字符串跑分别跑正反一遍字典树,再看看正反跑的结果能不能拼成原串。 然而常数太大了点,并没什么卵用。。 1 #in 阅读全文
摘要:
题目大概是,每个人收到信息后会把信息发给他认识的一个人如此下去,问一开始要把信息发送给谁这样看到信息的人数最多。 首先找出图中的SCC并记录每个SCC里面的点数,如果传到一个SCC,那么里面的人都可以看到信息。 然后SCC缩点后就形成DAG,直接记忆化搜索,d(u)搜索从u点出发开始传最多能传多少人 阅读全文
摘要:
题目大概就是求一个n个不同的数能构造出几种形态的二叉排序树。 和另一道经典题目n个结点二叉树不同形态的数量一个递推解法,其实这两个问题的解都是是卡特兰数。 dp[n]表示用n个数的方案数 转移就枚举第几个数作为根,然后分成左右两子树,左右两子树的方案数的乘积就是这个数作根的方案数 另外就是题目得先找 阅读全文
摘要:
题目是问,一个有向图有多少个点v满足∀w∈V:(v→w)⇒(w→v)。 把图的强连通分量缩点,那么答案显然就是所有出度为0的点。 用Tarjan找强连通分量: 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using n 阅读全文
摘要:
这题事实上只需要关心15个商店和一个起点一个终点,预处理出这几个点之间的最短距离。Floyd会超时,用Dijkstra即可。 然后就是dp[u][S]表示已经经过商店集合S且当前在第u个商店所花的最少时间。 最后的结果是找到所有dp[u][S]有解且u能到达终点的最大的|S|,而最短时间就是dp[u 阅读全文
摘要:
题目问一个有向图所有点都能达到的点有几个。 先把图的强连通分量缩点,形成一个DAG,那么DAG“尾巴”(出度0的点)所表示的强连通分量就是解,因为前面的部分都能到达尾巴,但如果有多个尾巴那解就是0了,因为尾巴间达到不了。判断是否有多个尾巴,可以从最后一个强连通分量中的某一个点出发看能否在逆图上遍历完 阅读全文
摘要:
这道题要判断一张有向图是否是单连通图,即图中是否任意两点u和v都存在u到v或v到u的路径。 方法是,找出图中所有强连通分量,强连通分量上的点肯定也是满足单连通性的,然后对强连通分量进行缩点,缩点后就变成DAG。 现在问题就变成,如何判断DAG是否是单连通图——用拓扑排序——如果拓扑排序过程中出现1个 阅读全文
摘要:
一道经典的树型DP入门题。dp[u][0/1]表示u点不选或选时以u为根的子树最多能选择的点数。 题目给的有向有环图可以看作森林,注意不是树,因为题目没有说图是连通的! 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 us 阅读全文
摘要:
题目大概是给一张图,动态加边动态求割边数。 本想着求出边双连通分量后缩点,然后构成的树用树链剖分+线段树去维护路径上的边数和。。好像好难写。。 看了别人的解法,这题有更简单的算法: 在任意两点添边,那么两点路径上的边就不是割边了,于是从两点往上走到其LCA,一边缩点一边统计消失的割边数。 这样的时间 阅读全文
摘要:
题目大概是给一个无向连通图,问最少加几条边,使图的任意两点都至少有两条边不重复路径。 如果一个图是边双连通图,即不存在割边,那么任何两个点都满足至少有两条边不重复路径,因为假设有重复边那这条边一定就是割边,与不存在割边矛盾。 这题的解法是:原图的边双连通分量是符合要求的可以看作一点,即把原图的边双连 阅读全文
摘要:
题目要输出一个无向图的所有割边。用Tarjan算法: 一遍DFS,构造出一颗深度优先生成树,在原无向图中边分成了两种:树边(生成树上的边)和反祖边(非生成树上的边)。 顺便求出每个结点的DFS序dfn[u] 和 每个结点能沿着它和它的儿子的返祖边达到的结点最小的DFS序low[u]。 一条边(u,v 阅读全文
摘要:
题目求一个无向图的所有割点,并输出删除这些割点后形成几个连通分量。用Tarjan算法: 一遍DFS,构造出一颗深度优先生成树,在原无向图中边分成了两种:树边(生成树上的边)和反祖边(非生成树上的边)。 顺便求出每个结点的DFS序dfn[u] 和 每个结点能沿着它和它的儿子的返祖边达到的结点最小的DF 阅读全文
摘要:
题目大概是说给一棵树的n个结点从1到n编号,要求每个结点的编号大于其父结点,问有多少种编号方式。 想了挺久的,感觉有点眉目,最后画了下样例YY出解法: 首先求出以每个结点为根的子树大小,记为size[u],这个DFS一遍就可以求出来; 接下来,dp[u]表示给以u为根的子树size[u]个编号有几种 阅读全文
摘要:
题目问N匹马比赛有多少种结果。一开始想用排列组合搞搞,然后发现想错了。艰难地把思路转向DP,最后AC了。 dp[i][j]表示前i匹马确定出j个名次的方案数 dp[1][1]=1 对于第i匹马,它要确定出j个名次:要嘛前i-1匹确定出j个次名,然后第i匹可以成为第1...j名;要嘛前i-1匹确定出j 阅读全文
摘要:
题目问从N个数中取出M个数,有多少种取法使它们的和能被D整除。 dp[i][j][k]表示,前i个数取出j个数模D的余数为k的方案数 我用“我为人人”的方式来转移,就从i到i+1转移,对于第i+1个数有取和不取两种选择,然后确定j和k这两个维度的情况。 另外题目说数字是32位有符号整数,所以是会出现 阅读全文