fork(2) download
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. vector<int> A;
  7. vector<int> lis,back;
  8.  
  9. int main() {
  10. int n;
  11. scanf("%d",&n);
  12. A.resize(n); lis.resize(n,1); back.resize(n,-1);
  13. for(int i=0; i<n; i++) scanf("%d",&A[i]);
  14. //compute values lis and back
  15. for(int i=0; i<n; i++)
  16. for(int j=0; j<i; j++) {
  17. if(A[j]>=A[i]) continue;
  18. if(A[j]+1>lis[i]) {lis[i]=A[j]+1; back[i]=j;} //I found better subsequence
  19. }
  20. //find last element of LIS
  21. int end=0;
  22. for(int i=0; i<n; i++)
  23. if(lis[i]>lis[end]) end=i;
  24. //go after back links
  25. vector<int> LIS;
  26. while(end!=-1) {
  27. LIS.push_back(A[end]);
  28. end=back[end];
  29. }
  30. //we've got reversed subsequence
  31. reverse(LIS.begin(),LIS.end());
  32. for(int i=0; i<LIS.size(); i++) printf("%d ",LIS[i]); printf("\n");
  33. return 0;
  34. }
Success #stdin #stdout 0s 2868KB
stdin
10
5 1 7 5 3 8 13 12 13 14
stdout
5 7 8 13 14