解法一: DP
int lis( int arr[], int n )
{
int *lis, i, j, max = 0;
lis = (int*) malloc ( sizeof( int ) * n );
/* Initialize LIS values for all indexes */
for ( i = 0; i < n; i++ )
lis[i] = 1;
/* Compute optimized LIS values in bottom up manner */
for ( i = 1; i < n; i++ )
for ( j = 0; j < i; j++ )
if ( arr[i] > arr[j] && lis[i] < lis[j] + 1)
lis[i] = lis[j] + 1;
/* Pick maximum of all LIS values */
for ( i = 0; i < n; i++ )
if ( max < lis[i] )
max = lis[i];
/* Free memory to avoid memory leak */
free( lis );
return max;
}
解法二: O(nlogn)
vector<int> X = {10, 22, 9, 33, 21, 50, 41, 60};
vector<int> p(8,0);
vector<int> m(9,0);
int l = 0;
for(int i = 0; i < X.size(); ++i){
int lo = 1;
int hi = l;
while(lo <= hi){
int mid = (lo + hi) / 2;
if(X[m[mid]] <= X[i]){
lo = mid + 1;
}
else {
hi = mid - 1;
}
}
int newL = lo;
p[i] = m[newL - 1];
if(newL > l) {
m[newL] = i;
l = newL;
} else if(X[m[newL]] > X[i]){
m[newL] = i;
}
}
vector<int> s(l,0);
int k = m[l];
for(int i = l - 1; i >= 0; --i){
s[i] = X[k];
k = p[k];
}