思路:
1、开辟数组L,L[i]记录的为a[0]~a[i]的最长递增子序列长度
2、开辟数组maxV,maxV[i]记录的为长度为i的各递增子序列的最后一个元素的最小值,譬如有子序列
1,2,4
1,2,5
则maxV[3] = 4
3、使用maxLen记录当前的最长递增子序列长度
4、转移方程: L[i+1] = max{1,L[j]+1] , a[i] > maxV[j] && j <= maxLen
int LIS(int* a, int n){ int* maxV = new int[n+1]; int* L = new int[n]; maxV[1] = a[0]; L[0] = 1; int maxLen = 1; for(int i = 1, j; i < n; ++i){ L[i] = 1; for(j = maxLen; j >= 1; --j){ if(maxV[j] < a[i]){ L[i] = j+1; break; } } if(L[i] > maxLen){ maxLen = L[i]; maxV[maxLen] = a[i]; } else{ if(j >= 1 && maxV[j+1] > a[i]){ maxV[j+1] = a[i]; } } } delete[] maxV; delete[] L; return maxLen; }
参考编程艺术2.16
[算法]求数组中最长递增子序列长度,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/zhengyuhong/p/3858510.html