最长递增子序列:

 
  
  1. int MaxLen_SecondVersion(int* array, int nSize) 
  2.     { 
  3.         const int MAX = 50; 
  4.         int nLen[50]; 
  5.         nLen[0] = 1; 
  6.         for(int i=1; i<nSize; i++) 
  7.         { 
  8.             nLen[i] = 1; 
  9.             for(int j=0; j<i; j++) 
  10.             { 
  11.                 if( array[j] < array[i] && nLen[j]+1 > nLen[i]) 
  12.                     nLen[i] = nLen[j] + 1; 
  13.             } 
  14.         } 
  15.         int nMax = 0; 
  16.         for(int i=0; i<nSize; i++) 
  17.             if(nMax < nLen[i]) 
  18.                 nMax = nLen[i]; 
  19.         return nMax; 
  20.     } 
 
下面这个是用二分查找来优化的算法:http://fayaa.com/code/view/13122/
 
 
 
  
  1. int LIS_(int d[], int n) 
  2.     { 
  3.     int *B = new int[n]; 
  4.     int left, right, mid, len = 1; 
  5.     B[0] = d[1]; //为了和上面的一致,我们从1开始计数吧:) 
  6.     for(int i = 2; i <= n; ++i){ 
  7.         left = 0, right = len; 
  8.         while(left <= right){ 
  9.             mid = (left + right) / 2; 
  10.             if(B[mid] < d[i]) left = mid + 1; //二分查找d[i]的插入位置 
  11.             else right = mid - 1; 
  12.         } 
  13.         B[left] = d[i]; //插入 
  14.         if(left > len) len++; //d[i]比现有的所有数字都大,所以left 才会大于 len。 
  15.     } 
  16.     delete[] B; 
  17.     return len; 
  18.     }