O(nlogn)算法,最长上升子序列,,非动规

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了O(nlogn)算法,最长上升子序列,,非动规相关的知识,希望对你有一定的参考价值。

//最长上升子序列最快算法,非动态规划,运用了二分思想,还有栈的思想,
//用每一个数去和栈中的栈顶元素相比较,如果大于栈顶元素,则入栈,否则运用二分查找,寻找出第一个比这个数大的那个数替换
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
int main()
{
    int temp, tail;
    int n;
    int stack[1001];
    scanf("%d", &n);
    tail = 0;
    stack[0] = -1;
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &temp);
        if (temp > stack[tail])
            stack[++tail] = temp;//入栈
        else {
            int l = 1, r = tail;
            int  mid;
            while (l <= r)//二分
            {
                mid = (l + r) / 2;
                if (temp > stack[mid])
                    l = mid + 1;
                else r = mid - 1;
            }
            stack[l] = temp;
        }
    }
    printf("%d", tail);
    return 0;
}

 

以上是关于O(nlogn)算法,最长上升子序列,,非动规的主要内容,如果未能解决你的问题,请参考以下文章

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

LIS最长上升子序列O(n^2)与O(nlogn)的算法

POJ 1631 最长上升子序列的O(nlogn)算法

最长上升子序列问题 nlogn 实现算法的简述

dp之最长上升子序列

Java实现O(nlogn)最长上升子序列