括号序列

感悟于

括号序列计数

  • 我们设长度为 \(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]\) 的部分改成 \((()))))))\) 的形式就好了。
posted @ 2025-04-23 08:01  LUHCUH  阅读(33)  评论(0)    收藏  举报