LIS(Longest Increasing Subsequence)最长上升(不下降)子序列。
1. O(n^2)
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 5 int n,ans; 6 int a[10005],d[10005]; 7 8 int main(){ 9 scanf("%d",&n); 10 for(int i=1;i<=n;++i)scanf("%d",&a[i]); 11 for(int i=1;i<=n;++i){ 12 d[i]=1; 13 for(int j=1;j<i;++j) 14 if(a[i]>a[j]&&d[i]+1>d[j])d[i]=d[j]+1; 15 } 16 for(int i=1;i<=n;++i)ans=max(ans,d[i]); 17 printf("%d",ans); 18 return 0; 19 }
2. O(n logn)
1 #include<cstdio> 2 int n; 3 int a[10005]; 4 int stack[10005],top; 5 6 int main(){ 7 scanf("%d",&n); 8 for(int i=1;i<=n;++i)scanf("%d",&a[i]); 9 stack[++top]=a[1]; 10 for(int i=2;i<=n;++i){ 11 if(a[i]>stack[top])stack[++top]=a[i]; 12 else { 13 int l=1,r=top; 14 while(l<=r){ 15 int mid=l+r>>1; 16 if(stack[mid]<a[i])l=mid+1; 17 else r=mid-1; 18 } 19 stack[r]=a[i]; 20 } 21 } 22 printf("%d",top); 23 return 0; 24 }