Skip to content
0

括号序列相关计数 笔记

括号序列有一种做法,每次从最外层第一对配对的括号进行转移。

即对于区间 (...)...,从红色的这对括号转移。

1. CF1781F Bracket Insertion

对括号序列合法的定义进行转换:设 ( 表示 +1) 表示 1,合法的前提是对于每个位置,前缀和 0

于是考虑笔记开头说的转移方式,设 fi,j 表示长度为 i 的区间,第一个位置代表的前缀和为 j 的方案数。

考虑最终生成的括号序列,最外层的第一对括号。(*......,因此我们加入的 ())( 的第一个位置钦定在 *,剩下一个括号在 $ 中任意放,对于 (),变成了

((...).....

的形式,其中红色是左括号统领的,前缀和增加 1,蓝色是右括号统领的,前缀和不变,可以递归成两个子问题求解,故

fi,jk1,k2fk1,j+1×fk2,j×fi1k1k2,j×p

插入 )( 同理

fi,jk1,k2fk1,j1×fk2,j×fi1k1k2,j×p

状态数 O(n2),转移 O(n2),时间复杂度 O(n4),不能通过。

考虑优化,以第一种转移为例,考虑枚举 K=k1+k2,则有

fi,jKfi1K,j×p×k1+k2=Kfk1,j+1×fk2,j

后面的 做 DP 即可优化到 O(n) 预处理,O(1) 查询。

这里还少考虑了个操作顺序的问题,因为当有多个部分转移过来时,不好处理操作总顺序,但是优化完后我们的代码一直都是从两个部分转移,假设一个部分大小为 a,另一部分大小为 b,我们在两个部分中的操作顺序是任意的,所以要乘上 (a+ba)

时间复杂度 O(n3)

2. CF888F Connecting Vertices

这个可以看作类括号序列问题,主要的思想还是一样的。

不复制并破环为链不影响答案。根据题意,发现所有的连边一定是包含或相离关系(称 1223 也为相离)。

直接区间 DP 不对,因为和括号序列一样,会在 ()()() 时枚举断点多次转移。

于是考虑钦定最外层第一个配对的位置进行转移,设 fl,r,0/1 表示考虑区间 lr 连通,lr 是否直接连边的方案数,设 fl,rfl,r,0+fl,r,1。初始时 fi,i,11

于是考虑最外层第一个连边,有两种情况:

  1. 最外层第一对是 lr 直接连边,于是在 l,r 中枚举断点转移即可。
fl,r,1=midfl,mid×fmid+1,r
  1. 最外层第一对是 lmid,那么就是两个区间拼起来。
fl,r,1=midfl,mid,1×fmid,r

时间复杂度是区间 DP 的 O(n3)

最近更新