#include<bits/stdc++.h> using namespace std; int a[100],d[100],num=1; int main() { memset(d,0,sizeof(d)); int n; cin>>n; scanf("%d",&a[1]); d[0]=a[1]; for(int i = 2; i <= n; ++i) { scanf("%d", &a[i]); if(a[i]>d[num-1]) { d[num++]=a[i]; } else { d[lower_bound(d, d + num, a[i]) - d] = a[i]; } } cout<<num<<endl; return 0; }
用lower_bound找到上升序列中第一个大于等于新加入数的数,然后替换之
需要注意的是,这样只能求得最长升的长度,不能得到真正的序列。