[计数] [dp] AT_arc068_d [ARC068F] Solitaire
posted on 2025-04-08 03:36:55 | under | source
题意:将 \(1\dots n\) 依次插入双端队列,然后再取出来,求有多少种不同的取出序列 \(q\),满足 \(q_k=1\)。
双端队列一定形如“倒 V 形”,那么 \(q_1\dots q_k\) 一定要满足可以划分为 \(\le 2\) 个下降序列。\(q_{k+1}\dots q_n\) 相当于在一个升序序列首尾轮流取,确定 \(q_{1}\dots q_k\) 后,后面的方案数为 \(2^{n-k-1}\)。
现在有两条路子:只对 \(q_1\dots q_k\) 计数,并加上限制;规定 \(q_{k+1}\dots q_n\) 的一种特殊取法,然后对整个序列计数。
个人认为后者更好一点。需规定后面的数必须只从一端取,那么统计可以划分为 \(\le 2\) 个下降序列(等价于不存在递增三元组)且 \(q_k=1\) 的序列数量即可。对 \(q\) 取反,前者同样成立,后者变为 \(q_1=k\) 即可。
这样做的好处是方便 dp,设 \(f_{i,j}\) 为合法 \(i\) 排列且 \(q_1=j\) 的方案数,有转移:
- \(f_{i,1}=1\)。
- \(f_{i,i}=\sum\limits_{j<i}f_{i-1,j}\)。
- \(1<j<i\):\(f_{i,j}=\sum\limits_{k\le j} f_{i-1,k}\)。解释:\(q_2<j\) 无需考虑 \(q_1\) 开头的三元组(因为 \(q_2\) 显然更优);\(q_2=i\) 时 \(q_2\) 扣掉即可;\(j<q_2<i\) 不可能成立(后面还有个 \(i\))。
前缀和优化 \(O(n^2)\)。
从格路计数的角度出发,发现前缀和数组 \(g_{i,j}\) 恰好对应从 \((1,1)\) 走到 \((i,j)\) 而不超过对角线的方案数。即可 \(O(n)\)。

浙公网安备 33010602011771号