nefu1118 最长上升子序列(LIS)

Posted a_clown_cz

tags:

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

discription:定义臻.排序数列如下:一个数列删去其中一个数后是从小到大排好序的,称这个数列为臻.排序数列。现在给你一个数列,判断它是否为臻.排序数列。

intput:多组输入数据,每组有两行,第一行一个整数 n (2<=n<=1000000),第二行有 n 个整数,表示给定的数列

output:如果是臻.排序数列,输出"YES",否则输出"NO"。

simple input:

5

1 2 6 4 5

5

5 4 3 2 1

simple output:

YES

NO

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cstdlib>
using namespace std;

int a[1000005],dp[1000005];
int main()
{
    int n,len;
    while(scanf("%d",&n)==1)
    {
        for(int i=1; i<=n; i++)
            scanf("%d",a+i);
        dp[1]=a[1];
        len=1;
        for(int i=2; i<=n; i++)
            if(a[i]>=dp[len]) dp[++len]=a[i];
            else
            {
                int p=lower_bound(dp+1,dp+len+1,a[i])-dp;
                dp[p]=a[i];
            }
        if(len==n-1||len==n) puts("YES");
        else puts("NO");
    }
    return 0;
}

 

 

 

 

 

 

1

以上是关于nefu1118 最长上升子序列(LIS)的主要内容,如果未能解决你的问题,请参考以下文章

最长公共上升子序列 (LIS+LCS+记录)

动态规划模板1|LIS最长上升子序列

算法练习--- DP 求解最长上升子序列(LIS)

LIS:最长上升子序列

Lintcode--010(最长上升子序列)

LIS(最长上升子序列)