查找给定长度的增加子序列的总数

时间:2015-10-19 04:23:03

标签: algorithm dynamic-programming subsequence

给定一组数字,问题是找到 总数 增加长度的子序列 lis-1 < / strong>,其中 lis 是给定数组的Largest Increasing sub-sequence的长度。

示例:假设数组为5 6 3 4 7 8。在这里, lis = 4 。所以, lis-1 = 3 。因此,子序列的总数为8,并在下面给出:

5 6 7
5 6 8
3 4 7 
3 4 8
3 7 8
6 7 8
5 7 8
4 7 8

有人能给我一个关于这个算法的想法吗,我无法弄明白。

2 个答案:

答案 0 :(得分:0)

我认为有一种动态编程方法。对于序列中的每个点,保持一个数组,其中包含终止于该长度为k的点的子序列数。

在每个点上,你可以从数组的内容到它的左边以及子序列的相应点计算出它的数组内容:从左边的点添加数组值,其序列值小于当前值,例如: count [currentPos] [k + 1] + = count [leftPos] [k]。

最后,数组中最高的非零位置标记了最大增加子序列的位置,而正好低于该值的值表示长度增加的子序列的计数更短。

答案 1 :(得分:0)

即使不使用动态编程,您也可以解决这个问题。假设数组的元素是唯一的(您可以进一步扩展重复的想法),Idea是您维护一个集合(以递增顺序存储唯一元素)和填充当你处理数组元素时,这个集合。如果你可以通过当前元素扩展集合(意味着当前元素是目前为止看到的最大元素),那么你将这个元素追加到集合的末尾,否则当前元素将替换其中一个集合元素的位置将是您适合当前元素的位置。这样,当它的长度为lis-1时跟踪集合并增加计数器。 我希望有所帮助,如果您需要更多解释,请告诉我。