例如:
s = <6, 5, 4, 3, 2, 1>, s1 = <6, 4, 1>, s2 = <5, 2>, s3 = <5, 3, 2>
给定S
为序列,S1
和S2
是要考虑的有效子序列,但S3
不是,因为它包含连续的元素3和2。
如何找到一个最长的子序列,使它在O(n^2)
中单调递减
我知道问题的版本包含单调的增加/减少。
但这里的附加条件让它变得困难。
有没有更好的办法?
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),