algorithm - 约束最长递增子序列

标签 algorithm dynamic-programming computer-science memoization lis

考虑一个数组,它有 N 个整数。现在我们得到了一个索引 i,它可以接受从 1N 的值。这个特定的索引应该始终存在于我们生成的 LIS 中。计算 i 处每个值的 LIS。

我们如何才能有效地解决上述问题呢?我直接的解决方案是改变索引 i 的所有值并计算 LIS。时间复杂度高达 O(N2log(N))。能打吗?

示例:

N = 2.i = 1

假设给定的数组是 [1,2]。

[1,2][2, 2]

每种情况下最长(严格)递增的子序列是21

最佳答案

LIS 的规范动态程序为每个 k 计算索引 1..k 处元素的最长递增子序列,其中包括索引处的元素 >k。使用此数据和k..n 的最长递增子序列的镜像数据,我们找到包含索引k 作为 之前最长子序列的并集的LIS kk 之后最长的。

O(n log n)

关于algorithm - 约束最长递增子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50472478/

相关文章:

c++ - 将双 vector 拆分为相等的部分

algorithm - 归纳图中的顶点和 - 动态规划

algorithm - 库存、供应链、采购管理和计算机科学——一般性、高级问题

c - C 中使用拉格朗日插值计算多项式系数的算法

c++ - Coin Change 自底向上动态规划

math - 了解 lambda 演算有多大帮助?

python - 运行main函数时出现AssertionError

algorithm - 树中每对节点之间的距离

algorithm - 查找数组中重复的三元组

arrays - 交换两个元素时更新数组的最大和子间隔