找到所有可能的最长的递增子序列,没有重复项

时间:2018-07-02 16:33:48

标签: dynamic-programming

我想知道找到并打印所有最长的递增子序列而不重复的最佳算法。 我已经知道LIS problem。 但是,这不能解决元素重复的情况。 考虑示例:

-7 9 2 3 8 8 6 10

如果我们考虑重复的'8',则可能存在以下LIS:

-7 2 3 8(a) 10    -(1)
-7 2 3 8(b) 10    -(2)
-7 2 3 6    10    -(3)

但是,我想确保将前两个LIS打印为一个LIS,因为两者实质上是相同的序列,尽管它们之间的差异是8。

我正在研究Competitive Programming 3第3.5章中显示的O(n log k)方法。源代码为here

我的想法是,在图形中跟踪每个元素的后代。 每次有一个新的最长的递增子序列等于当前长度,我将遍历该图。如果后代已经存在,我将不会构造新的后代。例如,在上面的第(2)和(3)行中,由于第4个元素已经存在8个,因此我将不构造新的后代。但是,那时还不存在6个,因此我将构造6个,后跟10个作为后代。

使用二进制搜索将需要O(log k)找到要插入的正确位置,然后是O(k)遍历图形。这两个操作将运行n次。

因此,整体时间复杂度为O(n(log k + k))。有更好的方法吗?

0 个答案:

没有答案