括号树

我们首先考虑是一个序列的情况下,怎么求解这个问题。

\(f[i]\) 表示前 \(i\) 个字符的方案数。

首先,不匹配当前字符,从 \(f[i-1]\)

若当前字符是右括号,那么可以唯一确定它对应的左括号,设位置为 \(j\)

由于串必须要连续,所以必须保证以 \(j-1\) 结尾,可以用 \(f[j-1]-f[j-2]\) 求解,类似于一个容斥的思想。

最后,由于可以直接放弃掉前面的,所以 \(+1\)

考虑树的情况,只需要 \(i-1\rightarrow p_i\),左括号指向的就是一个节点编号,若设为 \(j\),则 \(f[j-1]-f[j-2]\rightarrow f[p_j]-f[p_{p_j}]\)。再弄一个栈模拟序列的情况。

posted @ 2023-09-17 19:20  wscqwq  阅读(7)  评论(0编辑  收藏  举报