1081: 最长上升子序列Ⅱ(dp+二分)

题目描述

PIPI又来考大家最长上升子序列问题了~
不过这次它想为难一下你~
给你一个整数序列,包含n个整数,要你求最长上升子序列的长度~

输入

多组输入
第一行为一个整数n,1<=n<=1000000
第二行包括n个整数,每个整数均在int范围内

输出

输出一个整数,表示最长上升子序列的长度。

样例输入

5
1 2 5 4 7

样例输出

4

#include <bits/stdc++.h>
using namespace std;
int n;
const int N=1e6+5,INF=1e9;
int B[N],A[N];  ///B[i]表示最长上升子序列为长度为i时的末尾最小值
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++){
            scanf("%d",&A[i]);
        }
        int len=1;
        B[len]=A[1]; ///初试化B[1]的值
        for(int i=2;i<=n;i++)
        {
            if(A[i]>B[len])  ///A[i]的值大于B长度为len的末尾的值时,将A[i]放到B数组的末尾
                B[++len]=A[i];
            else
            {
                int pos=lower_bound(B+1,B+len+1,A[i])-B; ///二分法找到更小的A[i]应该存放的B的位置,比如 1 3 4 此时遇到2,应该用2将3替换掉,变成1 2 4,1 2比1 3更小
                B[pos]=A[i];
            }
        }
        printf("%d\n",len);
    }
    return 0;
}

发布了78 篇原创文章 · 获赞 7 · 访问量 4566

猜你喜欢

转载自blog.csdn.net/weixin_44433678/article/details/104613613