0%

hihocoder 1529 不上升序列

前言

听说最早的题目原型是CF13C
下面按这题来讲,其实就是换成了不降。

朴素DP

定义$f_i(X)$ 为前$i$个数变为不降序列且$a_i\le X$的最小步数。
显然有
$f_1(X) = min_{Y\le X}{|a_1-Y|}$
$f_i(X) = min_{Y\le X}{f_{i-1}(Y)+|a_i-Y|}$

离散的DP

可以令${b_i}$为${a_i}$的一个有序copy,复杂度$O(n^2)$。
详情请阅 CF13C Tutorial

单调性优化

$f_i(X) = min_{Y\le X}{f_{i-1}(Y)+|a_i-Y|}=min(f_i(X-1),f_{i-1}(X)+|a_i-X|)$
由绝对值和最小值的性质,$f_i$对于$X$是一个单减的非负函数,并最后保持一个非负值。
考虑其“斜率函数” $g_i(X)=f_i(X+1)-f_i(X)$,则$g_i(X)$单增(不会证)。
$g_i(X)$的值域为有限个小于等于0的整数,我们将值域中每个数对应的最小的$x$写为一个序列(即“变化点”),即序列的最后一个数为使得$g_i(x)=0$的最小的$x$,……

突然发现我还是不会证,,那就没必要了,,大家还是看资料吧。。

参考资料

  1. http://codeforces.com/blog/entry/47821
  2. http://codeforces.com/blog/entry/47094?#comment-315161
  3. https://media.hihocoder.com/contests/challenge29/sol.pdf
咖啡,亦我所需也