题目大意
现有一个长为 L的数轴,你要从0走到 L
给出n个互不相交的可行域。
你要选择长度为p的段,要求每一个段都要在可行域内。
选完一段之后下一段要么和其相接,要么和其间距至少为t,求问最多能选择几段。
解法1:动态规划
首先,我们得到以下结论:
1.如果我当前在一个可行域上有线段,那么必然是连续去取线段,直到结束。
这样,影响答案的无非是这n个可行域哪些插入线段,哪些被忽视。
接下来得到解法:f(i,j)表示前i个可行域,右端点为j最多插多少线段。(第二位状态个数太多)
注意到第二位状态j十分冗余,考虑优化:
2.在i固定,f(i,j)最优的时候,j越小越好。
所以f(i)表示前i个可行域最多插多少线段,g(i)表示在保证f(i)最优的情况下最小的右端点。
注意到g(i)递增,从而。
f(i) = max{ f(j) + ( Ri - g(j) )/p } (g(j)∈[Li, Ri])
g(i) = min{ Ri + t - ( Ri - g(j) )%p }
f(i) = max{ f(j) } + (Ri - Li)/p (g(j) < Li)
g(i) = min{ Ri + t - (Ri - Li)%p }
利用g(i)的单调性可以对两种dp转移方程进行均摊线性的维护。
解法2:算法分治
(待补)