Queue Sorting
给定长度为 \(n\) 的序列 \(A\)。
若长度为 \(m = \sum\limits_{i=1}^{n} a_i\) 的序列 \(B\) 满足下列条件,则称其为好序列:
-
对于所有 \(i \in [1,n]\),\(B\) 中恰好包含 \(a_i\) 个 \(i\)。
-
\(B\) 可以被拆分成至多两个不下降子序列。
求满足条件的序列 \(B\) 数量,对 \(998244353\) 取模。
\(1 \leq n \leq 500\),\(0 \leq a_i \leq n\),\(1 \leq m \leq 500\)。
由经典结论,可知条件等价于 \(B\) 的最长下降子序列长度 \(\leq 2\)。
为了方便,我们将 \(B\) 翻转,我们需要让 \(B\) 的最长上升子序列长度 \(\leq 2\)。
考虑将所有数从小到大加入序列,计算当前的序列方案数。
我们容易发现,在第一个长度为 \(2\) 的最长上升子序列后,不能再加入新的数。
设当前加入了 \(1\) 到 \(i\) 的所有数,只能在第 \(j\) 个数前加数,此时方案数为 \(d_{i,j}\)。
接下来加入第 \(i+1\) 个数,有如下情况:
-
在序列开头加数
-
在第 \(j\) 个数前加数。
不妨设第一种情况加入了 \(x\) 个数,第二种情况在原序列的第 \(y\) 个数后开始加数。
此时 \(dp_{i,j}\) 会转移到 \(dp_{i+1,x+y+1}\),接下来考虑转移系数。
也就是说,现在我们要在 \(j-y\) 个空里填 \(a_{i+1} - x\) 个数,其中第一个空必填。
此时对应的方案数为 \(\dbinom{a_{i+1} - x + j - y - 2}{j - y - 1}\)。
dp 即可,注意特判 \(x = a_{i+1}\)。

浙公网安备 33010602011771号