记号
sb 题 / 模板题前加:\(\circ\)
有一定难度的题前加:\(\Re\)
不可做的,积累经验的题前加:\(\Im\)
完全是自己做的题前加:\(\bigstar\)
看了题解或讨论的题前加:\(\Game\)
总结前加:\(\color{red} \bigstar\)
AT/CF 前加:\(\Delta\)
时间是停课之后。
时间、题目、总结、题解占用标题行。
正文
2.4
\(\Im\) \(\Game\) CF713C Sonya and Problem Wihtout a Legend
trick:严格单调递增转单调不降、一点贪心的选择。
设 \(dp_{i, j}\) 为只考虑前 \(i\) 个数,且将 \(a_i \to b_j\) 的最小代价,其中 \(b\) 为排序后的 \(a\) 序列。
可以感性理解,这个状态设计是正确的,一定会有决策点在序列的之上。
将 \(a_i \to a_i - 1\) 可以实现第一个 trick 的转化,因为相邻项至少相差 \(1\)。
在此基础上,就有转移方程:
\[dp_{i, j} = \min_{k \in [1, j]} \{ dp_{i - 1, k} \} + |a_i - b_j|
\]
对于里面的 \(\min\),额外开一个数组维护即可。
时间复杂度 \(O(n ^ 2)\)。
for(int i = 1 ; i <= n ; ++ i) {Min[i][0] = 1e18;for(int j = 1 ; j <= n ; ++ j) {dp[i][j] = Min[i - 1][j] + abs(a[i] - b[j]);Min[i][j] = min(Min[i][j - 1], dp[i][j]);}
}