模板一(O(n^2))
const int MAXN=100000;
int dp[MAXN];//记录LIS的长度
int c[MAXN];//存储所求序列
int LIS(int c[],int N){
int m;//记录最大的j
int ans=1;
dp[1]=1;
for(int i=1;i<=N;i++){
m=0;
for(int j=1;j<i;j++){
if(a[i]>a[j]&&dp[j]>m)
m=dp[j];
}
dp[i]=m+1;
ans=max(ans,dp[i]);
}
return ans;
}
模板二(O(nlog(n)))
int b[MAXN]//记录长度为i的LIS的第i个元素的最小值
/*搜索a[i]在b[]中的位置pos*/
int Binary_Search(int a,int k){
int l=1,r=k;
while(l<=r){
int m=(l+r)/2;
if(a[i]>=b[m])
l=m+1;
else
r=m-1;
}
return l;
}
int LIS(int c[],int N){
int k=1;//记录LIS的长度
b[1]=a[1];
for(int i=2;i<=N;i++){
if(a[i]>=b[k])
b[++k]=a[i];
else{
int pos=Binary_Search(a[i],k);
b[pos]=a[i];
}
}
return k;
}