题目
给定一个长度为 N 的数列,求它数值单调递增的子序列长度最大为多少。即已知有数列 A , A=A1,A2…An ,求 A 的任意子序列 B ( B=Ak1,Ak2…Akp ),使 B 满足 k1<k2<…<kp 且 Ak1<Ak2<…<Akp 。现求 p 的最大值。
方法1
复杂度: O(n2)
#include<iostream>
using namespace std;
int n,ans;
int a[10005];
int f[10005];
int main()
{
cin>>n;
for( int i=1;i<=n;++i)
cin>>a[i];
for( int i = 1 ; i <= n ; ++i )
{
for( int j = 1 ; j < i ; ++j )
if( a[ j ] < a[ i ] )
f[ i ] = max( f[ i ] , f[ j ] ) ;
++f[i];
ans=max(ans,f[i]);
}
cout<<ans<<endl;
return 0;
}
方法二
复杂度O(nlogn)
#include <iostream>
using namespace std;
int i,j,n,s,t,a[100001];
int main()
{
cin>>n;
a[0]=-999999;
for(i=0;i<n;i++)
{
cin>>t;
if(t>a[s]) //比栈顶大就入栈
a[++s]=t;
else
{
int l=1,h=s,m;
/* 二分检索栈中比t大的第一个数 */
while(l<=h)
{
m=(l+h)/2;
if(t>a[m])
l=m+1;
else
h=m-1;
}/* 用t替换 */
a[l]=t;
}
}/* 最长序列数就是栈的大小 */
cout<<s<<endl;
}