我想知道找到并打印所有最长的递增子序列而不重复的最佳算法。 我已经知道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))。有更好的方法吗?