hrbust 1835 最长递增子序列【nlogn】

来源:互联网 发布:域名和服务器怎么绑定 编辑:程序博客网 时间:2024/06/05 18:25

最长递增子序列Time Limit: 1000 MSMemory Limit: 32768 KTotal Submit: 331(110 users)Total Accepted: 143(101 users)Rating: Special Judge: NoDescription

给出一个数字序列求其最长的递增子序列例如序列(1,7,3,5,9,4,8).

(1,7)和(3,4,8)是其递增子序列但其最长的递增子序列是(1,3,5,8)。


Input

本题有多组测试数据,对于每组测试数据第一行是一个整数n(n<=100)代表序列长度。

第二行是n个整数。

Output最长递增子序列长度Sample Input

7

1 7 3 5 9 4 8

Sample Output4

思路:


求一个最长递增子序列,n^2的dp容易在某些题中被卡,所以我们这次来用nlogn解。


Ac代码:


#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;int a[1000000],b[1000000],c[1000000];int find(int *a,int len,int n)//若返回值为x,则a[x]>=n>a[x-1]{    int left=0,right=len,mid=(left+right)/2;    while(left<=right)    {        if(n>a[mid]) left=mid+1;        else if(n<a[mid]) right=mid-1;        else return mid;        mid=(left+right)/2;    }    return left;}void fill(int *a,int n){    for(int i=0; i<=n; i++)        a[i]=1000000010;}int main(){    int n,i,j;    while(~scanf("%d",&n))    {        fill(c,n+1);        for(i=0; i<n; i++)        {            scanf("%d",&a[i]);        }        c[0]=-1;//     …………………………………1        c[1]=a[0];//         …………………………2        b[0]=1;//      …………………………………3        for(int i=1; i<n; i++) //           ………………4        {            j=find(c,n+1,a[i]);//  …………………5            c[j]=a[i];// ………………………………6            b[i]=j;//……………………………………7        }        int output=0;        for(int i=0; i<n; i++)        {            if(b[i]>output)output=b[i];        }        printf("%d\n",output);    }}







0 0
原创粉丝点击