括号序列
感悟于
括号序列计数
- 我们设长度为 \(2n\) 的合法括号序列个数为 \(f_n\)
考虑转移,我想得是,若一个括号序列可以由多个括号序列并排排列起来,若一个括号序列只能删除左右两边的括号。感觉这不太优美可能需要配合 \(g\) 辅助,然后还要求生成函数啥的。- wiki 的优美刻画:注意到对于括号序列我们有更简单的刻画,由于合法括号序列左端点必然为 \((\) 所以我们剥离第一对 \(()\) 然后序列被化为里面外面两部分,满足和为 \(n-1\)
- 其实就是 \(f_n=\sum_{i=0}^{n-1}f_if_{n-i-1}\) 初始有 \(f_0=1\)
- 好,下面内容本来要放坑了,但是发现 deepseek 太强大所以补充上来了。
- 我们设 \(f_n\) 含义不变,\(g_n\) 为该括号序列不能分段,也就是 \(s_1=(,s_{2n}=)\) 于是
- 设生成函数 \(F(x),G(x)\) 于之对应,有 \(G(x)=xF(x),F(x)=F(x)G(x)+1\)
\[F(x)=xF(x)^2+1
\]
- 解方程
\[F(x)=\frac{1-\sqrt{1-4x}}{2x},F(x)=\frac{1+\sqrt{1-4x}}{2x}
\]
- 后者设去,有
\[F(x)=\frac{1-\sqrt{1-4x}}{2x}
\]
\[\sqrt{1-4x}=\sum_{n=0}^{\infty}\binom{\frac{1}{2}}{n}(-4x)^n
\]
- 当 \(n=0,\binom{\frac{1}{2}}{0}(-4x)^0=1\) 所以有
\[F(x)=-\frac{1}{2x}\sum_{n=1}^{\infty}\binom{\frac{1}{2}}{n}(-4x)^n
\]
\[F(x)=-\frac{1}{2x}\sum_{n=1}^{\infty}\frac{(-1)^{n-1}(2n-3)!!(-4x)^n}{2^nn!}
\]
\[F(x)=\frac{1}{2x}\sum_{n=1}^{\infty}\frac{(2n-3)!!2^nx^n}{n!}
\]
\[(2n-3)!!=\frac{(2n-2)!}{(2n-2)!!}=\frac{(2n-2)!}{(n-1)!2^{n-1}}
\]
\[F(x)=\frac{1}{x}\sum_{n=1}^{\infty}\frac{(2n-2)!}{(n-1)!n!}x^n
\]
\[F(x)=\sum_{n=0}^{\infty}\frac{2n}{n!(n+1)!}x^n=\sum_{n=0}^{\infty}(\frac{\binom{2n}{n}}{n+1})x^n
\]
- 所以其实 \(f_n=\frac{\binom{2n}{n}}{n+1}\) 其实也就是 Catalan 数
- 补充: 递推关系
\[F(x)=xF(x)^2+1
\]
\[xF(x)^2=x(\sum_{i=0}^{\infty}f_ix^i)^2=x(\sum_{n=0}^{\infty}\sum_{i=0}^nf_if_{n-i}x^n)=\sum_{n=1}^{\infty}(\sum_{i=0}^{n-1}f_if_{n-i-1})x^n
\]
\[F(x)=\sum_{n=1}^{\infty}(\sum_{i=0}^{n-1}f_if_{n-i-1})x^n+1
\]
- 于是 \(f_n=\sum_{i=0}^{n-1}f_{i}f_{n-i-1},f_0=1\) 这于我们的递推关系相符合。
- 补充:舍解
- 上文解出
\[F(x)=\frac{1-\sqrt{1-4x}}{2x},F(x)=\frac{1+\sqrt{1-4x}}{2x}
\]
- 考虑 \(\sqrt{1-4x}\) 的展开
\[(1-4x)^{\frac{1}{2}}=\sum_{n=0}^{\infty}\binom{\frac{1}{2}}{n}(-4)^nx^n
\]
- 考虑 \([x^0](1-4x)^{\frac{1}{2}}=1\),那么 \([x^0](1-(1-4x)^{\frac{1}{2}})=0,[x^0](1+(1-4x)^\frac{1}{2})=1\)
- 若等于 \(1\) 说明存在 \(1\),然后算上整体的 \(\frac{1}{2x}\),最终生成函数会存在一个 \(\frac{1}{2}x^{-1}\) 的项,负数项是不被允许的。故此,舍去 \(1+\sqrt{1-4x}\),而且 \(\frac{1}{2x}\) 的存在,使序列发散。
字典序
- 我们令左括号为 \(0\),右括号为 \(1\),求一个长度为 \(n\) 括号序列是所有长度为 \(n\) 的合法括号序列中字典序第几小的。
- 我们考虑 \([0,i],i\in[0,n]\cap\mathbb{Z}\) 这段区间的括号相等,下一个位置,\(s_{i+1}=)\) 我们就可以选择一个左括号 \((\) 然后剩下的任选,但满足需要有剩余的若干个右括号。也就是说我们从又往左匹配统计还剩 \(m\) 个括号的方案数。
- 设 \(f(x,y)\) 表示考虑了 \(x\) 个位置,右括号比左括号多 \(y\) 个的方案数,显然转移 \(f(x,y)=f(x-1,y+1),f(x-1,y-1)\),\(f(0,0)=1\) 然后不能有 \(y\) 为负数的情况。这其实是一个不经过折线的格路计数,然后就可以 \(O(|s|)\) 算了。
求字典序下一个括号序列
- 其实就是找到最后面的一个左括号位置记作 \(i\),满足 \([1,i]\) 中左括号,大于右括号,然后把 \(i\) 改成又括号,\([i+1,n]\) 的部分改成 \((()))))))\) 的形式就好了。

浙公网安备 33010602011771号