当前位置: 首页 > 知识库问答 >
问题:

最长单调递减子序列,不包含连续元素

华飞驰
2023-03-14

例如:

s = <6, 5, 4, 3, 2, 1>, s1 = <6, 4, 1>, s2 = <5, 2>, s3 = <5, 3, 2>

给定S为序列,S1S2是要考虑的有效子序列,但S3不是,因为它包含连续的元素3和2。

如何找到一个最长的子序列,使它在O(n^2)中单调递减

我知道问题的版本包含单调的增加/减少。

但这里的附加条件让它变得困难。

有没有更好的办法?

共有1个答案

皇甫鸿远
2023-03-14
D[i] = max { D[j] + 1 | a[i] < a[j], j < i + 1 } U {1} 

说明:对于每个元素a[i],您的动态编程(DP)检查所有在它之前且值较低但不相邻的数字--如果新的数字可以用于扩展最佳序列的话。此外,您还可以选择开始一个新序列(这时{1}开始播放)。

示例:S=<6,0,5,8,4,7,6>

D[1] = max { 1 } = 1  // sequence = <6>
D[2] = max {1} = 1  // sequence = <0>
D[3] = max {1, D[0] + 1 } = 2  // sequence = <6, 5>
D[4] = max {1} = 1  // sequence = <8>
D[5] = max{D[3] + 1, D[1] + 1, 1} = 3 // sequence = <6, 5, 4>
D[6] = max{D[4] + 1, 1} = 2  // sequence = <8, 7>
D[7] = max{D[4] + 1, 1} = 2  // sequence = <8, 6>

该算法以O(n^2)运行,因为计算D[i]需要O(i)时间。从等差数列之和,求和到O(n^2)以计算全部。

当您计算完所有D[.]后,您将遍历所有D[.]并找到最大值。这是在线性时间内完成的。

 类似资料:
  • {4,5,1,5,7,6,8,4,1},答案是5。 对于第一个例子,子数组{5,3,1,4,2}排序后可以形成连续序列1,2,3,4,5,它们是最长的。 对于第二个示例,子数组{5,7,6,8,4}是结果子数组。

  • 假设我们有一些不相交的递减序列: 我选择一些递减序列(例如按顺序,,,,的5个递减序列)并将它们级联(结果序列。 现在我想求S中最长递增子序列的长度,在上面的示例中:-> 预期时间复杂度小于O(S)。

  • 我为这个问题写了一个方法:输入:整数数组返回:最长连续整数序列的长度。like:对于{9,1,2,3},返回3,因为{1,2,3} 这个方法运行得不好。希望有人能帮我调试。 非常感谢!!!

  • A是一个数组,B是A中所有元素的质因数阶,< code>size(A)=N (1 到目前为止,我还没有想过这个问题,所以没有什么成就,但是我保证我已经想了很久了,希望有帮助,谢谢!

  • 给定一个列表{x_i},我想要找到从每个元素开始的最长的递增子序列,使得起始元素包含在子序列中。 最明显的方法是对每个元素执行通常的最长递增子序列算法,给出O(n^2logn)。这能打吗?

  • 我在阅读了允许K个异常的最长递增子序列后创建了这个线程。我意识到提问的人并没有真正理解这个问题,因为他指的是一个链接,该链接解决了“允许一次更改的最长递增子数组”问题。所以他得到的答案实际上与李的问题无关。 假设给定一个长度为N的数组A。查找允许K个异常的最长递增子序列。 示例:N=9,K=1 A=[3,9,4,5,8,6,1,3,7] 答案:7 说明: 最长递增子序列为:3,4,5,8(或6),