第 \(41\sim60\)道杂题。
[AGC062B] Split and Insert
有一个排列 \(A\) 满足 \(A_i=i\ (1\leq i \leq N)\)。进行 \(K\) 次操作:
- 任意选择一个 \(k\) ,选择排列最末尾 \(k\) 个元素,将其插入进前面 \(n-k\) 个元素。
定义所有操作的代价是 \(\sum_{i=1}^{K}k_iC_i\),其中 \(k_i\) 表示第 \(i\) 轮选择的 \(k\),求最终变为给定的排列 \(P\) 的最小代价或判无解。
\(1\le N \le 100\)。
非常棒的一道题。
发现正着做非常没有头绪,正难则反。
相当于从最终的序列中每次取一个子序列出来放在最后,求最后变为 \(1\sim n\) 的序列的最小代价。
令 \(dp_{i,l,r}\) 表示,经过 \(i \sim k\) 轮操作后将数字 \(l\sim r\) 从小到大排序的最小代价,答案即为 \(dp_{1,1,n}\)。
\[\min\{dp_{i+1,l,r},dp_{i+1,l,x}+dp_{i+1,x+1,r}+(r-x)\times c_i \} \to dp_{i,l,r}
\]
初始化就是将所有本来就有序的 \([l,r]\) 的 \(dp_{k+1,l,r}\) 设为 \(0\)。