#include #include #include #include #include template struct Node { E value; std::tr1::shared_ptr > pointer; }; template struct node_ptr_less { bool operator()(const std::tr1::shared_ptr > &node1, const std::tr1::shared_ptr > &node2) const { return node1->value < node2->value; } }; template std::vector lis(const std::vector &n) { typedef std::tr1::shared_ptr > NodePtr; std::vector pileTops; // sort into piles for (typename std::vector::const_iterator it = n.begin(); it != n.end(); it++) { NodePtr node(new Node()); node->value = *it; typename std::vector::iterator j = std::lower_bound(pileTops.begin(), pileTops.end(), node, node_ptr_less()); if (j != pileTops.begin()) node->pointer = *(j-1); if (j != pileTops.end()) *j = node; else pileTops.push_back(node); } // extract LIS from piles std::vector result; for (NodePtr node = pileTops.back(); node != NULL; node = node->pointer) result.push_back(node->value); std::reverse(result.begin(), result.end()); return result; } int main() { int arr1[] = {3,2,6,4,5,1}; std::vector vec1(arr1, arr1 + sizeof(arr1)/sizeof(*arr1)); std::vector result1 = lis(vec1); std::copy(result1.begin(), result1.end(), std::ostream_iterator(std::cout, ", ")); std::cout << std::endl; int arr2[] = {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15}; std::vector vec2(arr2, arr2 + sizeof(arr2)/sizeof(*arr2)); std::vector result2 = lis(vec2); std::copy(result2.begin(), result2.end(), std::ostream_iterator(std::cout, ", ")); std::cout << std::endl; return 0; }