LongestIncreasingSubsequence.cpp 757 B

123456789101112131415161718192021222324252627282930313233
  1. // Given a list of numbers of length n, this routine extracts a
  2. // longest increasing subsequence.
  3. // Running time: O(n log n)
  4. int A[MAX_N], indice[MAX_N], back[MAX_N];
  5. VI lis(VI values, bool strict) {
  6. int N = values.size();
  7. int k = 0;
  8. fill_n(back, N, -1);
  9. for(int i = 0; i < N ; i++) {
  10. int j;
  11. if(strict)
  12. j = lower_bound(A, A + k, values[i]) - A;
  13. else
  14. j = upper_bound(A, A + k, values[i]) - A;
  15. if(j == k) {
  16. A[k] = values[i];
  17. indice[k] = i;
  18. ++k;
  19. } else if(values[i] < A[j]) {
  20. A[j] = values[i];
  21. indice[j] = i;
  22. }
  23. if(i && j && j-1 < k)
  24. back[i] = indice[j-1];
  25. }
  26. VI longest(k);
  27. int cur = indice[k-1];
  28. for(int i = longest.size()-1; i >= 0; i--) {
  29. longest[i] = values[cur];
  30. cur = back[cur];
  31. }
  32. return longest;
  33. }