给定n对数字,第一个数字总是小于第二个数字。当且仅当b <= c时,对(c,d)可以跟随一对(a,b)。可以以这种方式形成对链。找到可以从给定的一对组中形成的最长链。
e.g。 { (1,2), (3,4), (5,7), (9,10), (7,9), (8,9), (0,6) }
所以输出应该是:{(1,2), (3,4), (5,7), (8,9), (9,10)}
我的算法如下:
1. Sort the list according to the 2nd number of elements
i.e.`{ (1,2), (3,4), (0,6), (5,7), (7,9), (8,9), (9,10) }`
2. choose the first element from the list i.e. `(1,2)`
3. for each element e in the list left
4. choose this element e if the first number of the element is greater than the 2nd number of the previous element. i.e. after `(1,2)` choose `(3,4)` because `3 > 2.`
在上述算法之后,您将输出为{(1,2), (3,4), (5,7), (8,9), (9,10)}
。
请告诉我有关算法的正确性。谢谢。
修改
更直观的正确证明:
证明:在链中包含更多对的唯一方法是用一个具有较小Y值的对替换一对,以允许下一个 配对有一个较小的X值,可能适合另一对在哪里 它以前不适合。如果将一对替换为具有相同Y的一对 价值,你什么都得不到。如果替换具有更大的Y值,则全部 你已经完成了可能会阻止一些之前适合的对。
因为这些对已按Y值排序,所以您永远不会找到具有较小Y的替换。在排序中查找“向前” 对,它们都具有相同或更大的Y值。看着 “落后”,最初从链中消失的任何东西都是 因为X值不够高,情况仍然如此。
这取自here
答案 0 :(得分:2)
这是对的。这是一个证据:
让s1, s2, ..., sl
成为算法找到的对,i1, i2, ..., ik
是最佳解决方案。
我们有:
l == k => your algorithm is obviously correct, since it's clear that
it doesn't produce invalid solutions;
l > k => this would contradict our hypothesis that i1, ..., ik is optimal,
so it makes no sense to bother with this;
l < k => this would mean that your algorithm is wrong.
Let's assume this is the case.
假设i1 != s1
。在这种情况下,我们可以在最佳解决方案中将i1
替换为s1
,因为s1
是具有最低完成时间的对。所以s1, i2, ..., ik
仍然是最佳解决方案。
让t <= l
成为st != it
的第一个索引。因此,s1, s2, ..., s[t-1], it, ...
是最佳解决方案。我们可以将it
替换为st
,因为:
st
不是最佳解决方案的第一个t-1
元素的一部分; st
不属于i[t+1], ..., ik
。如果是,则意味着st
在it
完成后开始,这与算法选择st
的方式相矛盾。因此,继续以这种方式,我们的最佳解决方案是s1, s2, ..., sl, ..., ik
。这意味着可以在sl
之后添加更多对,但这与算法的工作方式相矛盾,因此我们有l = k
,算法正确。
答案 1 :(得分:2)
(c, d)
可以关注一对(a, b)
iff b <= c
(c, d)
有约束d > c
我们可以说,
b <= c
变为
b < d because d > c
因此,最长的序列将从最小的第二个元素开始。因此,您根据第二个元素选择第一个元素对它们进行排序,并根据您的原始条件b <= c
算法是正确的。当你得到第一个元素(贪婪)然后你保持原始约束完整b <= c
。
注意:
排序后您无法使用b < d
条件来比较元素,因为您无法从b <= c
推断出b < d
(原始条件),但可以采用其他方式。
答案 2 :(得分:-1)
这个问题可以通过很多方法解决 已经有相同类型的问题检查它 给你n对数字。在每对中,第一个数字总是小于第二个数字。如果b
你可以去这里有很多有用的资源