对于如要求选mmm个东西的最优化问题,f[i][..]f[i][..]f[i][..]表示选了iii个东西的答案,则DP的时间和空间复杂度必然都与mmm线性相关。但如果f[i]f[i]f[i]关于iii是一个斜率单调不增的函数(凸函数),则可以使用DP凸优化将复杂度降为与logm\log mlogm线性相关。
考虑将f[]f[]f[]中的iii这一维去掉,但这样就没法保证选mmm个。于是考虑将选择一个物品的代价提高kkk,则此时选的东西必然减少。于是我们二分kkk的值,每次做一遍DP求出对于当前kkk实际选的物品个数,使选的物品个数等于mmm。但此时每个物品的代价是修改过的,将答案减去mkmkmk即可。
注意二分的时候有可能找不到刚好选mmm个的kkk,此时根据题目要求取相近的kkk即可。
与一类DP方程的联系
给定一个带权序列,将序列分为kkk段,设每段和为sis_isi,求∑f(si)\sum f(s_i)∑f(si)的最小值,其中fff的斜率单调不减(四边形不等式)。
可以直接用DP凸优化做。