CF1437F
好神奇的 dp 题。
description
给定数组 \(a\),求其有多少个排列满足
- 
\(y_i=\max(a_1,a_2,\dots,a_{i-1})\) 
- 
\(\forall i\in [1,n]\cap\mathbb{Z},2a_i\leq y_i ~\texttt{OR}~ 2y_i\leq a_i\) 
以下标区分排列。
solution
我们称一个排列中所有满足 \(2y_i\leq a_i\) 的 \(i\) 为关键点。
将 \(a\) 数组排序,记 \(s_i\) 表示 \(a\) 数组中 \(\leq \lfloor\dfrac{a_i}{2}\rfloor\) 的数的个数加 1。
设 \(f_i\) 表示考虑前 \(i\) 个数,第 \(i\) 个数是关键点且所有 \(\leq \lfloor\dfrac{a_i}{2}\rfloor\) 的数与 \(a_i\) 本身都已经填好的方案数。
如果 \(2\times a_{n-1}>a_n\),答案为 0;否则,根据状态定义,答案为 \(f_n\)。
这是本题状态设计很有意思的一点,状态本身不能表示所有情况的答案,但是我们可以直接回答其不能表示的情况的答案。
下面来转移:
- 
\(f_0=1\) 
- 
\(f_i=\sum\limits_{j=0,a_j\times2\leq a_i} A_{n-s_{a_j}-1}^{s_{a_i}-s_{a_j}-1}f_j\) 
考虑第二个转移式的意义。
我们枚举上一个关键点 \(j\),那么根据状态定义,当前还有 \(n-s_{a_j}\) 个位置,又因为 \(a_i\) 一定放在 \(a_j\) 后第一个没有填的位置(否则该位置不能填其他合法的数),所以还有 \(n-s_{a_j}-1\) 个位置不确定,我们要把 \(>\lfloor\dfrac{a_j}{2}\rfloor\) 且 \(\leq \lfloor\dfrac{a_i}{2}\rfloor\) 的除了 \(a_j\) 的 \(s_{a_i}-s_{a_j}-1\) 个数填进去排列。(可以发现,所有空位一定在 \(a_i\) 后边,所以可以放心地把这些数填进去)
特别地,\(j=0\) 时,系数为 \(A_{n-1}^{s_{a_i}-1}\) 正好也符合上述转移式。
感觉这个 dp 特别神奇,因为从正面去想总感觉哪里不对,但是仔细思考却可以发现其正确性。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号