练习题目:https://www.nowcoder.com/questionTerminal/d83721575bd4418eae76c916483493de
code O(n^2):
#include <cstdio>
#include <algorithm>
#define MAXN 1010
using namespace std;
int a[MAXN] , dp[MAXN];
int n,ans;
int main()
{
while(~scanf("%d",&n)){
for(int i=0;i<n;i++) scanf("%d",&a[i]);
dp[0]=1;
for(int i=1;i<n;i++){
dp[i]=1;
for(int j=0;j<i;j++){
if(a[j]<a[i]) dp[i]=max(dp[i],dp[j]+1);
}
}
for(int i=ans=0;i<n;i++) ans=max(ans,dp[i]);
printf("%d\n",ans);
}
return 0;
}
code O(n*log(n)):
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 1010
using namespace std;
int a[MAXN],c[MAXN];
int n,len=0;
//折半查找
int binary_search(int x)
{
int l=1,r=len,mid;
while(l<=r)
{
mid=(l+r)>>1;
if(x>c[mid])l=mid+1;
else
r=mid-1;
}
return l;
}
int main()
{
while(~scanf("%d",&n)){
for(int i=0;i<n;i++) scanf("%d",&a[i]);
len = 0;
for(int i=0;i<n;i++){
int k = binary_search(a[i]);
c[k]=a[i];
len = max(len,k);
}
printf("%d\n",len);
}
return 0;
}