NYOJ 214 单调递增子序列(二) (单调递增子序列)

单调递增子序列(二)

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述

给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。

如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。

输入
有多组测试数据(<=7)
每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表示数列中的所有元素.每个整形数中间用空格间隔开(0<n<=100000)。
数据以EOF结束 。
输入数据保证合法(全为int型整数)!
输出
对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。
样例输入
7
1 9 10 5 11 2 13
2
2 -1
样例输出
5
1
 1 #include <iostream>
 2 #include <cstdio>
 3 const int MAX = 100000 + 10;
 4 using namespace std;
 5 int a[MAX], dp[MAX];
 6 
 7 int binary_search(int digit, int length)
 8 {
 9     int left=1,right = length,mid;
10     mid=(right+left)/2;
11     while(left<=right)
12     {
13         if(digit==dp[mid])
14             return mid;
15         if(digit>dp[mid])
16             left=mid+1;
17         else
18             right=mid-1;
19         mid=(right+left)/2;
20     }
21     return left;
22 }
23 int main()
24 {
25     int n,i,j,k;
26     while(~scanf("%d", &n))
27     {
28         for(i=0;i<n;i++)
29             scanf("%d", &a[i]);
30         int len=1;
31         dp[1]=a[0];
32         for(i=1;i<n;i++)
33         {
34             j=binary_search(a[i],len);
35             dp[j]=a[i];
36             if(j>len)
37                 len=j;
38         }
39         printf("%d
",len);
40     }
41     return 0;
42 }
原文地址:https://www.cnblogs.com/caterpillarofharvard/p/4229156.html