题解:P9676 [ICPC 2022 Jinan R] Skills
考虑动态规划。
转移方程
首先读题可以明确出一个性质:当一种技能被选择后,其熟练度在此后不会降为 \( 0 \),否则一定有更优的取法。 这样就只需要无需考虑熟练度为负的状态。定义 dp 方程 \( f_{i, j, k, h} \) 表示第 \( i \) 天选择了第 \( h \) 个技能,剩余两个技能的未练习天数为 \( j \) 和 \( k \) 时的熟练度。使用 \( j, k = 0 \) 的情况来表示时候未选择这个技能的情况。由此可以得出转移方程如下:
- \( f_{i+1, nextj, nextk, h} \leftarrow \max(f_{i, j, k, h} + a_{i, h} - nextj - nextk) \) (选择当前技能的情况)
- \( f_{i+1, nextk, 1, h + 1} \leftarrow \max(f_{i, j, k, h} + a_{i, h+1} - nextk - 1) \) (选择下一种技能的情况)
- \( f_{i+1, 1, nextj, h+2} \leftarrow \max(f_{i, j, k, h} + a_{i, h+2} - nextj - 1) \) (选择下下种技能的情况)
其中 \( nextj = j + (j \neq 0) \),\( nextk \) 同理。在处理 \( h \) 的时候可以进行对 \( 3 \) 取模来用 \( {0, 1, 2} \) 表示三种技能。
复杂度分析
这个 dp 的时间复杂度为 \( O(nm^2) \),空间复杂度为 \( O(m^2) \)(显然可以用滚动数组滚掉第一维),其中 \( m \) 为未联系天数的值域。注意到在选择一个值 \( x \) 后,降到 \( 0 \) 的天数不超过 \( \sqrt{2x} \),因此 \( m \leq \sqrt{\max a_{i, j}} \)。令 \( a \) 值域为 \( W \),则 dp 时间复杂度为 \( O(nW) \),空间复杂度 \( O(W) \),可以通过此题。注意多测清空,以及滚动数组也要清空,因为这道题不能保证 \( f_{i, j, k, h} > f_{i - 2, j, k, h} \)。全 \( 0 \) 的反例就可证明。
1 | int n, a[N][3]; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 House Tsumugi!
评论



