【单调性DP】Road to Home
传送门:Codeforces721E
思路:
-
用$f_i$表示在前i段最多唱几首歌,$g_i$表示唱了$f_i$首歌时的最左位置;
-
$$ f_i=f_j+(r-max{l,g_j+t})/p\ g_i=r-(r-max{l,g_j+t})%p $$
-
可以知道f和g是非递减的,所以用来更新i的j应该满足$x_i\leqslant j\leqslant y_i$,其中$x_i$是满足$g_{x_i}+t\leqslant l_i$的最靠右的点,$y_i$是满足$g_{y_i}+t\leqslant r_i$的最靠右的点;
-
所以可以发现相邻两个i的转移区间最多只有一个相同的点,利用这一点可以做到$O(n)$。
注意:
- 括号匹配不要写错(讲道理可以多引入几个变量)。
代码如下:
|
|