最长上升子序列

时间限制: 10 Sec   内存限制:128 MB

题目描述

给定一个序列,初始为空。现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置。我们想知道此时最长上升子序列长度是多少?

输入

第一行一个整数N,表示我们要将1到N插入序列中,接下是N个数字,第k个数字Xk,表示我们将k插入到位置Xk(0<=Xk<=k-1,1<=k<=N)

输出

1行,表示最长上升子序列的长度是多少。

样例输入

3

0 0 2

样例输出

2

提示

100%的数据 n<=100000

O(nlogn)算法代码

 1 #include <iostream>
 2 using namespace std; 
 3 int i,j,n,s,t,a[100001];
 4 int main()
 5 { 
 6     cin>>n;
 7     a[0]=-1000000;
 8     for(i=0;i<n;i++)
 9     {
10         cin>>t;/* 比栈顶元素大数就入栈 */
11         if(t>a[s]) a[++s]=t;
12         else
13         {
14             int l=1,h=s,m;
15 /* 二分检索栈中比t大的第一个数 */
16             while(l<=h)
17             {
18                 m=(l+h)/2;
19                 if(t>a[m]) l=m+1;
20                 else h=m-1;
21             }/* 用t替换 */
22             a[l]=t;
23         }
24     }/* 最长序列数就是栈的大小 */
25     cout<<s<<endl;
26 }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-15
  • 2022-12-23
  • 2022-12-23
  • 2021-07-30
  • 2022-03-05
猜你喜欢
  • 2022-12-23
  • 2022-02-07
  • 2021-08-10
  • 2022-12-23
  • 2021-07-16
  • 2021-08-01
相关资源
相似解决方案