1 条题解
-
0
题意理解
我们有 个音符依次落在位置 。两只手各能覆盖一个长度为 的区间,初始都在 。移动一只手从 到 需要花费 的体力。要求打到所有音符的前提下最小化总体力消耗。
关键观察:
- 每个音符必须被至少一只手覆盖
- 手的移动是连续的,代价是曼哈顿距离
- 很小(最多 50),这是算法的突破口
核心思路
关键观察 1:状态设计
由于 很小,我们可以利用这个性质设计状态:
设 表示处理完前 个音符,左手覆盖区间 ,右手覆盖区间 的最小代价,其中 。
这里 是第 个音符的位置, 表示相对于当前音符的偏移量。
关键观察 2:状态转移
从 到 ,我们需要将手移动到能覆盖第 个音符的位置:
对于每个可能的新偏移量 :
$$dp[i+1][a'][b'] = \min\{dp[i][a][b] + |\Delta_1| + |\Delta_2|\} $$其中 ,
约束条件:第 个音符必须被至少一只手覆盖,即:
关键观察 3:优化策略
直接 DP 的状态数是 ,转移是 ,总复杂度 不可接受。
优化思路:
- 使用线段树维护状态的最小值
- 利用问题的单调性
- 减少不必要的状态
算法框架
方法一:基于相对位置的 DP
设 表示处理完前 个音符,两只手的相对位置差为 时的最小代价。
状态定义更精妙:由于两只手的移动是对称的,我们可以固定一个参考系。
方法二:离散化 + 线段树优化
- 离散化:将所有可能的手位置离散化
- 状态设计: 表示处理完前 个音符,某只手在位置 时的最小代价(另一只手的位置隐含确定)
- 线段树优化:使用线段树维护区间最小值,加速状态转移
方法三:决策单调性优化
观察发现,最优解中手的移动具有单调性:手不会无意义地来回移动。
可以利用这个性质设计 或 的算法。
复杂度分析
- 状态数:
- 转移优化:通过数据结构优化到 或 每次转移
- 总复杂度: 优化到 或更好
在 时, 的算法是可接受的。
实现细节
状态压缩技巧
由于 很小,我们可以:
- 将 映射到 的整数
- 使用位运算加速
- 利用缓存友好性
边界情况处理
- 初始状态:,其他为无穷大
- 音符覆盖检查:确保每个音符都被覆盖
- 坐标范围: 很大但差值可能很小
总结
本题的核心在于:
- 利用数据范围: 很小是算法设计的关键
- 状态设计:巧妙的相对位置表示
- 优化技巧:数据结构加速状态转移
- 问题转化:将几何覆盖问题转化为序列决策问题
这是一个典型的 动态规划优化 题目,需要:
- 对状态设计的深刻理解
- 熟练运用数据结构优化
- 对问题性质的敏锐洞察
符合集训队互测题目对算法优化能力的高要求。
- 1
信息
- ID
- 4424
- 时间
- 4000ms
- 内存
- 512MiB
- 难度
- 9
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者