范围的超级 - 寻找最大的距离

时间:2013-12-02 02:41:58

标签: algorithm range dynamic-programming

我有一个范围列表,每个范围都有相关的费用。一个例子是:

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.

我很确定这是一个动态编程问题,但我不知道可以使用的递归关系。这是最有效的方法吗?有人可以帮忙吗?

1 个答案:

答案 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