CF771E题解
很容易设出 \(dp_{i,j}\) 表示第一行选到 \(i\),第二行选到 \(j\) 的方案数
首先考虑部分分。
\(|a_i|\le 1\),那么产生贡献的一个矩阵不会超过 \(2\),那么就没必要考虑 \(|i-j|\ge 4\) 的状态了。证明如下:
不妨设 \(i<j\),那么我与其从 \(dp_{i,j}\to dp_{i,j+2}\) ,不如通过 \(dp_{i,j}\to dp_{i+2,j}\to dp_{i+2,j+2}\),这一定是不会更劣的,因为 \(dp_{i,j+2}\to dp_{i+2,j+2}\) 不会更优。
同理另一个部分分只需要考虑 \(|i-j|<20\) 的情况即可。
顺着这个思路,我们发现其本质是,如果有对于任意状态 \(dp_{i,j}\),如果是单独更新一行的话,我们没必要同时对一维增加两次。
于是对于所有 \(i\),我们只需要记录状态 \(dp_{i,i}\)(以方便两行更新),以及 \(\min j_1\text{ st.}dp_{j_1,i}=dp_{i,i}+1\) 与 \(\min j_2\text{ st.}dp_{i,j_2}=dp_{i,i}+1\) 即可。
这样就只有 \(\mathcal O(n)\) 个状态。
-
通过分析转移性质从而减少状态一个 remarkable 的技巧。
-
不要扭着看似正确的思路想,分析特殊性质是很有用的。