洛谷P5475 [CCO2015] 定音鼓手 题解

题解

这道题可以用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)$ 的方法来处理。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值