最长递增子序列:
- int MaxLen_SecondVersion(int* array, int nSize)
- {
- const int MAX = 50;
- int nLen[50];
- nLen[0] = 1;
- for(int i=1; i<nSize; i++)
- {
- nLen[i] = 1;
- for(int j=0; j<i; j++)
- {
- if( array[j] < array[i] && nLen[j]+1 > nLen[i])
- nLen[i] = nLen[j] + 1;
- }
- }
- int nMax = 0;
- for(int i=0; i<nSize; i++)
- if(nMax < nLen[i])
- nMax = nLen[i];
- return nMax;
- }
下面这个是用二分查找来优化的算法:http://fayaa.com/code/view/13122/
- int LIS_(int d[], int n)
- {
- int *B = new int[n];
- int left, right, mid, len = 1;
- B[0] = d[1]; //为了和上面的一致,我们从1开始计数吧:)
- for(int i = 2; i <= n; ++i){
- left = 0, right = len;
- while(left <= right){
- mid = (left + right) / 2;
- if(B[mid] < d[i]) left = mid + 1; //二分查找d[i]的插入位置
- else right = mid - 1;
- }
- B[left] = d[i]; //插入
- if(left > len) len++; //d[i]比现有的所有数字都大,所以left 才会大于 len。
- }
- delete[] B;
- return len;
- }
转载于:https://blog.51cto.com/tuoxie174/530243