我有一个范围列表,每个范围都有相关的费用。一个例子是:
1 to 1 | distance 10
1 to 2 | distance 9
2 to 3 | distance 8
3 to 4 | distance 2
我想从给定范围构建具有最大距离(称为L)的范围,条件是选择要添加“L”的每个范围必须是“L”的超集。 “L”从一个空的范围开始,所以任何东西都是它的超集。
例如,在给定范围内,
Take the first range [1..1] and then the range [1..2]
which combined gives a distance of 19.
说明:
Since L is originally empty, [1..1] has the greatest distance so it is now L.
L is now [1..1] whose only superset is [1..2] so that is now L.
L is now [1..2] which has no supersets so the greatest possible distance is 10 + 9 = 19.
我很确定这是一个动态编程问题,但我不知道可以使用的递归关系。这是最有效的方法吗?有人可以帮忙吗?
答案 0 :(得分:1)
对于每对范围,构建邻接矩阵(i-> j),这意味着i是j的子集。最终会出现多个有向图(其中一些图彼此断开连接)。
邻接矩阵可以如下构建:
首先按升序排序所有开始时间和结束时间
然后从左到右遍历,并按排序顺序保持活动间隔开始时间的双端(双端队列)。
每当达到一个起点时,按下后退中的间隔
每当到达终点时,它就成为列表中开始时间小于该间隔的所有间隔的子间隔。从前面弹出这个间隔。这将确保O的时间复杂度(间隔的超集数量)
该操作的复杂度应为O(n + E),其中n是区间数,E是边数。
对于每个图,现在的问题是在非循环有向图中找到最长的路径。这个link解释了如何解决这个问题,在您的问题中,成本与节点而不是边缘相关联。
编辑:对于示例区间:
1a to 1b | distance 10
1c to 2a | distance 9
2b to 3a | distance 8
3b to 4 | distance 2
开始和结束时间的排序列表:
1a, 1c, 1b, 2b, 2a, 3b, 3a, 4
每当开始和结束时间一致时,我们将在结束时间之前的开始时间。
The deque is empty initially.
1a added to deque from the back (start time of 1st interval).
1c added to deque (start time of 2nd interval)
The deque is now ___1a1c____ (double ended)
1b (end time of 1st interval encountered)
现在从前面弹出直到你得到它的开始时间(1a)。
____1c_____
现在我们看到1c等于1a,因此我们知道达到结束时间的间隔是1c间隔的子区间。所以我们从区间1到区间2建立边缘。
将下一个2b添加到deque(第3个间隔的开始时间)
_____1c2b___
然后遇到2a(第二个间隔的结束时间)
_____2b____
现在我们看到,与第一个pop不同,此处1c不等于2b,因此没有子区间关系。
将下一个3b添加到deque(第4个间隔的开始时间)
_____2b3b___
然后遇到3a(第3个间隔的结束时间)
_____3b____
我们再次看到,2b不等于3b,因此没有子区间关系。
类似于最后一个间隔。
所以我们看到我们在图中只有1个边缘,而所有只是一个没有边缘的节点图。
Graph 1 cost: 10 + 9 = 19.
Graph 2 cost: 8.
Graph 3 cost: 2