做题记录 25.3.28

NFLS #16543. DFS Order 4 \(\quad\) QOJ #8047. DFS Order 4

考虑如何判定一个 \(\text{dfs}\) 序是否合法

从左往右扫描,维护一个单调递增的栈,初始只有 \(1\)

设当前加入点为 \(u\),若栈顶 \(<u\) 则直接加入栈,否则弹出栈中 \(>u\) 的所有元素并把栈顶设为 \(u\),若此时栈已经空了则不合法

显然一个合法的序列唯一对应一棵合法的树,因此考虑统计树的数量

每个结点的儿子按编号从小到大排序,则对于一个结点 \(u\),必须满足 \(u\) 所有儿子编号都 \(>u\),且对于 \(u\) 的相邻两个儿子 \(v,w\),满足 \(w\) 小于 \(v\) 的最大儿子的编号

考虑如何统计满足以上要求的树的数量

\(dp_{i,j}\) 表示已经放置了 \(i\) 个点,剩下 \(j\) 个还没有决定的儿子,合法的概率

\(dp_{0,0}=1\),答案为 \(dp_{n,0}\times (n-1)!\),转移为

\[dp_{i,j}=\frac1i\left({dp}_{i-1,j-1}+{dp}_{i-1,1}{dp}_{0,j-1}-dp_{i-1,j+1}+\sum_{k=1}^{i-2}{dp}_{k,1}(dp_{i-k-1,j}+dp_{i-k-1,j-1})\right) \]

时间复杂度 \(O(n^3)\)

代码

posted @ 2025-03-29 06:54  Hstry  阅读(8)  评论(0)    收藏  举报