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; }
-