虽然明知有简洁明了的卡特兰数 DP 做法,还是写了题解的 DP 套 DP(
考虑给定最终序列 c 如何判定其是否合法:设 gi,j 表示检查了最终序列的前 i 位,第一队的前 j 位,目前是否合法。
那么有 gi,j=(ci=aj∧gi−1,j−1)∨(ci=bi−j∧gi−1,j),其中 a,b 分别表示第一、二队。
考虑利用这个 DP 的思路,套一个 DP 来计数。
由于两队内部互不相同,所以 gi.j=1⇒ci=aj∨ci=bi−j,于是若确定了最终序列的第 i 位,对应的 gi 最多有两个为 1。
于是设 fi,j,k=0/1/2 表示填了 c 的前 i 位,ci=j,gi 中两个值第一个为 1 / 第二个为 1 / 两个均为 1。
然后转移……整一些很恶心的分类讨论(
代码:
1 |
|