题解
这道题可以用DP解决。
我们定义 $f_{i,j,k,l}$ 为前 $i$ 个音符,其中第 $j$--$k$ 个鼓分别调整到为 $l$ 的最大空闲时间。这里的空闲时间指的是鼓手没有进行任何调整的时间。
注意到,因为我们可以任意地把音调所对应的数字进行平移,所以没有区别。
可以把音符调整成从 $1$ 开始排列的。
那么考虑状态转移:
对于 $f_{i,j,k,l}$,我们要考虑新加入的 $T_{i}$ 对 $f_{i,j,k,l}$ 的贡献。
若 $P_i < l$,那么无法处理,$f_{i,j,k,l}$ 不变。
若 $P_i > l$,那么有可能在这个时候对 $f_{i,j,k,l}$ 产生贡献,或者没有产生。
我们分别考虑:
- 对 $f_{i,j,k,l}$ 产生贡献:
在 $T_i$ 的时候,第 $k$ 个鼓可以调整到 $P_i$,即 $f_{i,j,k,P_i} = \max{f_{i,j,k,P_i},f_{i-1,j,k-1,l}+T_i-T_{i-1}}$ 。
- 对 $f_{i,j,k,l}$ 不产生贡献:
可以直接从 $f_{i-1,j,k,l}$ 转移过来,即 $f_{i,j,k,l} = f_{i-1,j,k,l}$。
注意到此时 $j\le k$,时间是单调递增的。因此可以省略第一维 $i$,直接用一维滚动数组优化 DP 方程。
最终答案为 $f_{N,1,d,1}$(因为 $k < l$ 是没有意义的)。
时间复杂度:$O(Nd^3)$。
看起来非常简单,实际上有很多坑:
- 当 $P_i=l$ 时,可能第 $k$ 个鼓不能够在 $T_i$ 前进入状态 $l$,此时 $f_{i,j,k,l}$ 不能够转移到 $f_{i+1,j,k,l}$
- 只能把 $k$ 号鼓转移到 $l$,那么在转移时,另一个鼓 $k-1$ 可能被转换到 $P_i$ 或 $P_i-1$,还有可能 $k$ 号鼓无法在 $T_i$ 前调整到 $P_i$。
- 空间无法接受,需要滚动数组。
这些坑都可以处理,但是处理起来有一定难度。
对于第二个坑,用 $g_{i,j,l}$ 表示 $f_{i,1,j,l}$ 经过 $1\sim j$ 次转移的最优解。则有
$$ g_{i,j,l}=\max(g_{i,j-1,l-1}+t_j-t_{j-1},f_{i,1,j,l}) $$
上面这个式子直接做会 TLE,需要一种 $\mathcal{O}(d^2)$ 的方法来处理。