首页 > 代码库 > CodeForces - 721E

CodeForces - 721E

题目大意

现有一个长为 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:算法分治

(待补)

CodeForces - 721E