最长上升子序列(LIS)的nlogn算法

序列用 A A 表示,处理到当前元素为止,长度为 i i 的子序列的最小的结尾元素用 B i B_i 表示。序列 B B 是单调增的,即
B i < B j if i < j B_i<B_j \quad \text{if}\quad i<j
因为如果 B i B j B_i\geq B_j ,那么 B j B_j 对应的子序列中的第 i i 个数是小于 B i B_i 的,这与 B i B_i 是最小的矛盾。
假设当前LIS长度为 L L ,现在要计算以 A k A_k 结尾的LIS,只需二分长度 l l ,看是否满足 B l < A k B_l<A_k 。假设以 A k A_k 结尾的LIS长度为 m m ,再进行一次更新:

B[m] = min(B[m], A[k]);
L = max(L, m);

即可。

猜你喜欢

转载自blog.csdn.net/anoli/article/details/89282394