算法作业求助:删除K个区间后最大化剩余区间覆盖点数
解题思路提示
区间排序与预处理
- 先将所有区间按右端点从小到大排序,这是后续处理的核心前提。
- 计算每个区间的覆盖点数:对于区间
[l, r],覆盖点数为r - l + 1,记为该区间的长度。
快速查找非重叠前驱
- 对每个区间
i,用二分查找找到最后一个与i不重叠的区间prev[i](即右端点 ≤i的左端点的最大区间索引)。由于区间已按右端点排序,这一步可以在O(NlogN)时间内完成。
- 对每个区间
动态规划+单调队列优化
- 定义状态
dp[j][i]:前i个区间中删除j个,且保留第i个区间时的最大覆盖点数。最终答案是所有dp[j][i](j ≤ K)中的最大值。 - 状态转移分两种场景:
- 若保留的第
i个区间与之前保留的区间无重叠:此时需从prev[i]之前的区间中选择,转移时取dp[j-d][k] - r[k]的最大值(d为中间删除的区间数,k为之前保留的区间索引),再加上当前区间的右端点r[i]。 - 若保留的第
i个区间与之前保留的区间有重叠:此时取dp[j-d][k]的最大值,加上当前区间的长度。
- 若保留的第
- 用单调队列维护每种
j对应的最大值,将时间复杂度从O(N*K²)优化到O(N*K),适配N=1e5、K=100的规模。
- 定义状态
关键注意点
- 贪心算法(按起点、终点、长度排序)无法保证全局最优,因为删除K个区间的选择需要权衡全局重叠情况,局部最优不一定能得到全局最大覆盖。
内容的提问来源于stack exchange,提问作者guitarMan
相关产品推荐
相关产品推荐

