Find longest increasing sequence (LIS)

来源:互联网 发布:穷人突破阶级知乎 编辑:程序博客网 时间:2024/05/19 15:19
#include <iostream>#include <stack>typedef unsigned int uint;void FindLIS(const uint arr[], uint length){uint* lis = new uint[length];uint* pre = new uint[length];lis[0] = 0;int max_length = 0;for (int i = 1; i < length; ++i){// find largest j that lis[arr[k]] < arr[i]int k = 0;for (int j = 0; j <= max_length; j++){if (arr[lis[j]] < arr[i])k = j;}pre[i] = lis[k];if (k == max_length || arr[i] < arr[lis[k + 1]]){lis[k + 1] = i;max_length = std::max(max_length, k + 1);}}std::stack<int> stk;int elem_idx = lis[max_length];for (int i = 1; i <= max_length; ++i){int elem = arr[elem_idx];stk.push(elem);elem_idx = pre[elem_idx];}while (!stk.empty()){std::cout << stk.top() << " ";stk.pop();}};int main(){const uint arr[] = {100000, 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15};uint arr_length = sizeof(arr) / sizeof(arr[0]);FindLIS(arr, arr_length);return 0;}