例1 CF713c
给你nnn个整数aia_iai,每次可以消耗111的代价使某一个数+1+1+1或者−1-1−1,让你求出使得aia_iai不下降的最小代价
n≤1e5n\le1e5n≤1e5
solutionsolutionsolution:
考虑dpdpdp,设fi,jf_{i,j}fi,j表示让第iii个数变成jjj,前iii个数已经不下降的最小代价,转移比较简单,fi,j=mink≤jfi−1,k+∣ai−j∣f_{i,j}=\min_{k\le j} f_{i-1,k}+|a_i-j|fi,j=mink≤jfi−1,k+∣ai−j∣,设gi,j=mink≤jfi,kg_{i,j}=\min_{k\le j}f_{i,k}gi,j=mink≤jfi,k,则有fi,j=gi,j+∣ai−j∣f_{i,j}=g_{i,j}+|a_i-j|fi,j=gi,j+∣ai−j∣,时间复杂度为O(nv)O(nv)O(nv),其中vvv为值域大小
如果我们把fif_ifi看成一个关于jjj的函数的话,fif_ifi一定是一个凸函数,归纳证明,fi−1f_{i-1}fi−1是凸函数,gi−1g_{i-1}