二分斜率

适用范围

对于某些2D\nD的dp,状态为dp[i][j]表示在i的时候选了j个东西的最优解,要求dp[n][m]。

分析

如果设F(m)=dp[n][m],如果F(m)是一个单峰函数(特别的,单调函数),那么我们设Cf(m)=F(m) - F(m-1) ,则Cf(m)是一个单调不降(不升)的函数,这个时候,我们从差分是离散的积分的观点来看,那么G(x)=F(x) - kx,当k=Cf(m)的时候,G(x)的最值在m处取到。
由于Cf单调,所以k也有单调性。基于此,我们可以得到一种做法:假若二分这个k,然后计算G(x)在什么地方取到最大值,然后就可以知道k应当向什么方向移动。
下面的问题是如何计算G(x)的最大值在什么时候取到。考虑横坐标的意义,是选取多少个数,那么 -kx 表示的是每选择一个,就要多付出k的代价。这样子就有了一个新的dp,dp’[n]表示在如上条件中取到的最优值以及此时选的个数。那么假如要多选一个数,就在之前的代价上多加一个k。这样子,就成功将一个m优化成了log。

细节

还要注意,由于斜率是单调不降的,所以可能有斜率相同的一部分,这个我们就钦定在答案最优的前提下尽量少选或多选数,这样可以得到斜率相同的一段的起点或者终点,然后就行了。

你可能感兴趣的:(dp,优化,省选)