最长的子序列,使LIS中的last-First元素最大

时间:2016-12-22 15:37:52

标签: algorithm dynamic-programming graph-algorithm

如何找到最长增长子序列的最后一个元素和第一个元素之间的差异,使得LIS中(最后一个元素 - 第一个元素)的值最大?

2 个答案:

答案 0 :(得分:1)

让我们使用标准的动态编程解决方案,我们将f[i]定义为i-th元素中以最长的增长子序列结束。我们可以为每个(max length, smallest first element)存储一对i。可以证明它导致了正确的全局解决方案(直观地说,它是正确的,因为它仍然存储了以特定元素结尾的所有子序列的最佳解决方案,以及一个前缀是"更好"比另一个意味着整个子序列更好)。

如果性能要求很高,您还可以通过将这些对存储在高效的数据结构(如段树)中来使其成为O(N log N)

答案 1 :(得分:0)

非常天真的算法如下:

  1. 在第一遍中查找所有最大连续子序列及其长度保持最大长度(只保留此数字)。
  2. 在第二遍中找到所有最大长度序列的起始和结束差异,并输出所有序列中最大的序列。
  3. 所有这些都在O(n)中,可以一次完成。为了简化它,我将其分解为两个步骤。