Algorithmus - laengste steigende teilsequenz



  • Hi,
    kann mir bitte jemand folgendes algorithmus erklaeren? er sucht die laengste steigende teilsequenz, also hier: 0, 2, 6, 9, 13, 15.

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <iterator>
    
    using namespace std;
    
    vector<int> find_lis(vector<int> A)
    {
      vector<int> m;
      vector<int> p(A.size());
    
      int i, begin, end, mid;
    
      m.push_back(0);
    
      for (i = 1; i < A.size(); i++){
        if (A[m.back()] <= A[i]){
          p[i] = m.back();   // the order here is important
          m.push_back(i);
          continue;
        }
    
        for (begin = 0, end = m.size() -1; begin < end; ){
          mid = (begin + end) / 2;
          if (A[m[mid]] <= A[i]) 
            begin = mid + 1;
          else
            end = mid;
        }
    
        if (A[i] < A[m[begin]]){
          m[begin] = i;
          if (begin > 0) p[i] = m[begin - 1]; 
        }
      }
    
      vector<int> result;
      int pos ;
    
      pos = m.back(); 
      for (i = m.size(); i > 0; i--){
        result.push_back(A[pos]);
        pos =  p[pos];
      }
    
      reverse(result.begin(), result.end());
      return result; 
    }
    
    int main()
    {
      int a[] = { 7, 8, 9, 10, 1, 2, 3, 3, 3, 4, 6, 7, 5, 8}; //14
    
      vector<int> A(a, a + sizeof(a) / sizeof(int));
      ostream_iterator<int> oit(cout, " ");
    
      vector<int> lis = find_lis(A);
    
      copy(A.begin(), A.end(), oit);
      cout << endl;
    
      copy(lis.begin(), lis.end(), oit);
      cout << endl;
    
      return 0;
    }
    



Anmelden zum Antworten