#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;
}
Find longest increasing sequence (LIS)
最新推荐文章于 2022-04-07 09:30:33 发布