考虑如下形式的状态转移方程: $$ f(i) = \max_{j < i} \{ y(j) - x(j) k(i) \} +h(i) $$ 其中$x(j),y(j),k(i),h(i)$皆为已知函数。去掉$\max$函数,可变形为: $$ y(j) = k(i)x(j) + h(i)-f(i) $$ 可以看作是:对于所有小于$i$的$j$,$(x(j), y(j))$确定了平面上的一系列点。斜率为定值$k(i)$的直线经过其中的一个点,当该直线的纵截距为最小时,$f(i)$取到最大值。 不难发现所有符合条件的点必然在一个凸包上。例如,当$k(i) > 0$时,欲使得纵截距最小,则所有的点必然在一个下凸包上,而最优决策点需要使得它与它之后的点连线的斜率恰好大于$k(i)$。
- 当$x(j)$单调不减的时候,每次都在凸包的最右侧插入点,因此可以用一个单调队列维护,保证入队前清除队尾凸包内的点即可。
- 若同时$k(i)$也单调不减,则由图形易知最优决策点也满足单调不减,因此可以不断弹出不符合条件的队首,则剩下的第一个点就是最优决策点。
- 若$k(i)$不具有单调性,则需要维护整个凸包,并二分查找最优决策点。
- 当$x(j)$不具有单调性,要么采用splay来对凸包进行动态插入,要么使用CDQ分治处理。此处略去。CDQ分治可参考这里。
注意事项:
- 和高中数学一样,注意讨论斜率不存在的情形,将不存在的斜率视$y$的差值的正负设为正无穷或负无穷;
- 队列初始有一个$0$,并始终保证队列中至少有一个元素;
- 理解清除队尾点的时候
slope(q[r-1], q[r])>=slope(q[r-1], i)
的几何意义。
例题
洛谷P3195
1 |
|
洛谷P5875
1 |
|