这篇文章写的很好:最长递增子序列(LIS)(原创博主:未已优)
这里我给一下第二种方式的代码:
#include <bits/stdc++.h>
#define maxn 1000
using namespace std;
int n;
int a[maxn+1];
int dp[maxn+5];
int main(int argc, char *argv[]) {
cin>>n;
for(int i=0; i<n; i++){
cin>>a[i];
}
memset(dp, -1, sizeof(dp));
dp[1] = a[0];
int len = 1;
for(int i=1; i<n; i++){
if(a[i] > dp[len]){
dp[++len] = a[i];
}
else{
//找第一个大于a[i]的数
/*直接找
for(int j=1; j<=len; j++){
if(dp[j] > a[i]){
dp[j] = a[i];
break;
}
}
*/
/*二分查找
int l=0, r=len,mid;
while(l<r){
mid = (l+r)/2;
if(a[i] < dp[mid]) r = mid;//这里注意不是r=mid-1
else l = mid+1;
}
dp[l] = a[i];
*/
//使用lower_bound()函数
int j = lower_bound(dp+1, dp+len+1, a[i])-dp;
dp[j] = a[i];
}
}
for(int i=1; i<=n+1; i++){
//cout<<dp[i]<<endl;
if(dp[i] == -1){
cout<<i-1<<endl;
break;
}
}
return 0;
}