循环最长的子序列

时间:2015-09-16 04:11:33

标签: algorithm lis

如果数字以圆形方式排列,我如何找到最长增加子序列的长度。例如:

LIS of 3, 2, 1 is 3 [1, 2, 3].

P.S我知道如何在O(nlogn)中解决线性LIS。

问题来源:https://www.codechef.com/problems/D2/

更新:LIS必须仅通过圆圈计算一次。 示例2:LIS of 1, 4, 3为2,可以是1, 31, 43, 4
感谢

1 个答案:

答案 0 :(得分:1)

有问题的例子是错误的。 [1,2,3]的圆周旋转为[2,3,1]或[3,1,2]。

在这种情况下,我们可以像增长最长的子序列一样解决它。为:

  1. 按升序对列表进行排序。

  2. 在原始列表中查找min元素。

  3. 从原始列表中的min_index开始迭代并将其与排序列表进行比较,并创建具有与最长公共子序列相同逻辑的中间数组L [i] [j]。我将从min_index变为(i + n-1)%n
  4. 最后返回L [max_index] [n]