【问题标题】:Find total number of Increasing Subsequences of given length查找给定长度的递增子序列的总数
【发布时间】:2015-10-19 04:23:02
【问题描述】:

给定一个数字数组,问题是找出长度递增子序列的总数 lis-1,其中 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

谁能给我这个算法的想法,我无法弄清楚。

【问题讨论】:

    标签: algorithm dynamic-programming subsequence


    【解决方案1】:

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

    在每个点,您都可以从其左侧数组的内容和子序列的相应点计算出其数组的内容:从左侧的点添加数组值,序列值小于当前值,例如count[currentPos][k+1] += count[leftPos][k].

    最后,数组中最高的非零位置标记了最大递增子序列的位置,而恰好低于该位置的值给出了长度短一的递增子序列的计数。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 但这听起来很幼稚,而且时间成本也很高。你不觉得吗。
      • 不,在集合中插入、删除和搜索是 O(logn) 并且您只对集合中要处理的每个新元素进行一次搜索/更新/插入。所以总体 O(nlogn) .
      • 好的,我明白了,但它会更好,你添加几个点,并把你的程序逐点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      相关资源
      最近更新 更多