Java 按递增顺序排列的对的最大长度
给定n对数字,第一个数字总是小于第二个数字。一对(c,d)可以跟随一对(A,b),当且仅当b这个问题可以用太多的方法解决 相同类型的问题已经存在了检查它 给你n对数字。在每一对中,第一个数字总是小于第二个数字。如果bJava 按递增顺序排列的对的最大长度,java,algorithm,Java,Algorithm,给定n对数字,第一个数字总是小于第二个数字。一对(c,d)可以跟随一对(A,b),当且仅当b这个问题可以用太多的方法解决 相同类型的问题已经存在了检查它 给你n对数字。在每一对中,第一个数字总是小于第二个数字。如果b
这是正确的。这里有一个证据: 让
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.
l==k=>您的算法显然是正确的,因为很明显
它不会产生无效的解决方案;
这与我们的假设相矛盾,即i1,…,ik是最优的,
因此,不必为此烦恼;
这意味着你的算法是错误的。
让我们假设情况就是这样。
假设i1!=s1
。在这种情况下,我们可以在最佳解决方案中将i1
替换为s1
,因为s1
是完成时间最短的一对。因此,s1,i2,…,ik
仍然是最佳解决方案
让t
配对(c,d)
可以跟在配对(a,b)
iffbc
所以我们可以说
b <= c
bc
因此,最长的序列将从最小的第二个元素开始。因此,您可以根据第二个元素对它们进行排序,选择第一个元素并根据原始条件进行比较b为什么不选择这对(7,9)?为什么它不在对(5,7)之后呢?给出的另一个有效链是{(1,2),(3,4),(5,7),(7,9),(9,10)}。你想找到这两条/所有的链条,或者是链条,最大长度的链条,或者其他什么吗?我认为这行不通,因为它太贪婪了。排除包含的一个元素可能会有更长的链。我认为这需要作为一个动态程序来完成。这个问题是要求代码审查,而不是提出问题。这个问题更适合CodeReview。值得一提的是,您的算法是正确的。稍后我可能会发布一个证明。这是一个注释,而不是一个答案。这些不是同一件事,因为它们涉及按元素出现的顺序选择元素。@Joel(0,6)怎么样?为什么不考虑(0,6)…这是一个极端情况或最长情况sequential@Envious我的算法与您发布的算法不同。我知道这可以在LIS中解决,但这是O(NLogN)算法,我觉得更容易理解。我知道还有一件事可以用O(NLogN)解决,但这有点棘手。谢谢。我喜欢这个校样。更直观+1.
b <= c
b < d because d > c