algorithm - 递增递减序列

标签 algorithm dynamic-programming sequences

元素的值先减小后增大的序列称为V-Sequence。在一个有效的 V 序列中,应该至少有一个元素在递减臂中,并且至少有一个元素在递增臂中。

例如,“5 3 1 9 17 23”是一个有效的 V 序列,在递减臂中有两个元素,即 5 和 3,在递增臂中有 3 个元素,即 9、17 和 23。但是序列“6 4 2”或“8 10 15”都不是 V 序列,因为“6 4 2”在递增部分没有元素,而“8 10 15”在递减部分没有元素。

给定一个包含 N 个数字的序列,找到它最长的(不一定是连续的)子序列,即 V 序列?

是否可以在 O(n)/O(logn)/O(n^2) 中执行此操作?

最佳答案

该解与最长非递减子序列的解非常相似。不同之处在于,现在对于每个元素,您需要存储两个值——从该元素开始的最长 V 序列的长度是多少,以及从该元素开始的最长递减子序列的长度是多少。请看一下typical non-decreasing subsequence的解决方案解决方案,我相信这应该是一个足够好的提示。我相信您可以实现的最佳复杂度是 O(n*log(n)),但是复杂度为 O(n^2) 的解决方案更容易实现。

希望这对您有所帮助。

关于algorithm - 递增递减序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9783943/

相关文章:

algorithm - 范围查询 - 树不包含上限和/或下限

algorithm - 最大可能的方形画笔画 Canvas

使用 for 循环或 switch 语句的 JavaScript 序列

python - Pandas 数据框创建为 2 系列的排列?

algorithm - 如何实现dp?

oracle - 将Oracle和H2用于同一应用程序时Grails中的ID生成问题

algorithm - O(n) + O(n log n) 是否等于 O(n log n)?

algorithm - 当我们有两个输出时的反向传播算法

javascript - 用一段生成 SVG 正弦波

c++ - 随机错误核心转储: `./a.out'中的错误:free():下一个大小无效(快速):0x00000000010e8d70 ***已中止(核心转储)