[计数] [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)\)

posted @ 2026-01-12 20:14  Zwi  阅读(1)  评论(0)    收藏  举报