受约束的最长增加子序列

时间:2018-05-22 16:27:32

标签: algorithm dynamic-programming computer-science memoization lis

考虑一个具有N个整数的数组。现在我们获得了一个索引i,它可以占用1N的值。该特定索引应始终存在于我们生成的LIS中。计算i处每个值的LIS。

我们如何有效地解决上述问题?我直截了当的解决方案是改变其所有值的索引i并计算LIS。时间复杂度达到O(N 2 log(N))。可以打败吗?

示例:

N = 2.i = 1

假设给定的数组是[1,2]。

[1,2][2, 2]

每种情况下最长(严格)增加的子序列是21

2 个答案:

答案 0 :(得分:1)

LIS的规范动态程序为每个k计算索引1..k处元素的最长增长子序列,其中包括索引k处的元素。使用此数据和镜像数据获得k..n最长的子序列,我们发现包含索引k的LIS作为k之前最长的联合,{{1}之后的最长联合}}

O(n log n)

答案 1 :(得分:0)

拥有一个必须在子序列中的索引i使得向左和向右看是一个容易的任务,看看你可以保持严格增加的距离。这最多只需要O(N)步。

直接解决方案现在只需对索引i处的所有N值重复此操作,这样可以总计O(N ^ 2)。

但请注意,在更改索引i处的值时,可以重复使用之前完成的计算。只需要检查序列是否可以在任何方向上扩展到i之外,如果是,你已经知道了多远(或者现在可以一次性地计算它)。

这使总努力降至O(N)。