Algorithm 最大覆盖不相交区间
假设有k似乎有一个O(k*log(k))解。它可以通过分段树数据结构来实现 首先,我们可以填充一些endPos段结尾数组,并对其进行排序。记忆对应于endPos索引的每个段。为此,让endPosIdx成为这样的数组,endPosIdxj将在endPos中存储索引,其中j-th段结束 接下来我们将介绍一个段树。它将处理以下请求:Algorithm 最大覆盖不相交区间,algorithm,intervals,greedy,cover,Algorithm,Intervals,Greedy,Cover,假设有k似乎有一个O(k*log(k))解。它可以通过分段树数据结构来实现 首先,我们可以填充一些endPos段结尾数组,并对其进行排序。记忆对应于endPos索引的每个段。为此,让endPosIdx成为这样的数组,endPosIdxj将在endPos中存储索引,其中j-th段结束 接下来我们将介绍一个段树。它将处理以下请求: 1. getMax(i)-获取范围[0,i]上的最大值 2. 更新(i,值)-用值更新i-第th个位置的最大值 i是endPos数组中的索引。调用getMax(i)我们询
1.
getMax(i)
-获取范围[0,i]
上的最大值2. <代码>更新(i,值)-用
值更新i
-第th个位置的最大值
i是endPos数组中的索引。调用getMax(i)我们询问如果在endPosi之后没有一个片段结束,我们可以实现什么样的最大覆盖率。调用update(i,value)我们说现在存在一个长度value结束于endPosi的封面
按起始位置对所有段进行递增排序aj。按顺序处理它们。要点是找到最大的封面,如果我们一定要在结果集的当前部分。当前覆盖范围将等于当前段的长度和当前段之前结束的段的最大覆盖范围之和。设j为当前段的索引(按起始位置排序)。设i为endPosi的最大索引≤ aj(i可通过二进制搜索从j中找到)。然后我们可以找到
coverj=lengthj+getMax(i)
接下来我们应该更新段树调用更新(endPosIdxj,coverj)并继续下一段
处理完所有段后,可以通过调用getMax(size(endPos))找到解决方案该问题可以在O(k log(k))
中解决
首先按区间的上界(即b_i
s)对区间进行排序。设I(1),I(2),…,I(k)
为已排序区间的列表。就是
b_1 <= b_2 <= ... <= b_k
w(i) = b_i - a_i
用f(i)
表示最后一个区间为i(i)
的最优解的总长度。也就是说,对应于f(i)
的解决方案是一组:
包含间隔I(I)
不包含上限高于b_i
在满足1+2的(非重叠)间隔集合中具有最大覆盖率
现在我们将计算f(1),f(2),…,f(k)
,并返回它们的最大值。显然,最优解对应于f(i)
s中的一个,因此最大f(i)
是最优解
为了计算每个f(i)
,我们使用动态规划。我们通过以下递推关系来实现这一点:
f(i) = w(i) + max{f(j) | b_j < a_i}
我们计算i=1,2,3,4的f(i)
:
f(1) = w(1) + max{None} = 3
f(1) intervals: {I(1)}
f(2) = w(2) + max{None} = 2
f(2) intervals: {I(2)}
f(3) = w(3) + max{f(1)} = 4 + 1 = 5
f(3) intervals = {I(1), I(3)}
f(4) = w(4) + max{f(1), f(2)} = 11 + f(1) = 11 + 3 = 14
f(4) intervals = {I(1), I(4)}
最大的f(i)
是f(4)
,它对应于一组区间{i(1),i(4)}
,这是最佳解决方案。区间的数量是多少,a_i,b_i的值最多?请告诉我您到目前为止尝试了什么?提示:您可以按左边框排序并计算dp[i]
=以ini
-第th段结尾的最大并集。如果您正确地跟踪事件(或使用类似于段树的数据结构),可以在O(k log k)
时间内完成。谢谢。我使用了二进制搜索来查找max{f(j)| b|jf(1) = w(1) + max{None} = 3
f(1) intervals: {I(1)}
f(2) = w(2) + max{None} = 2
f(2) intervals: {I(2)}
f(3) = w(3) + max{f(1)} = 4 + 1 = 5
f(3) intervals = {I(1), I(3)}
f(4) = w(4) + max{f(1), f(2)} = 11 + f(1) = 11 + 3 = 14
f(4) intervals = {I(1), I(4)}