I have a set of integers. I want to find the longest increasing subsequence of that set using dynamic programming.
Here are three steps of evaluating the problem from dynamic programming point of view:
If we take as an example sequence {0, 8, 2, 3, 7, 9}, at index:
Here's the working C++11 code:
#include
#include
int getLongestIncSub(const std::vector &sequence, size_t index, std::vector> &sub) {
if(index == 0) {
sub.push_back(std::vector{sequence[0]});
return 1;
}
size_t longestSubSeq = getLongestIncSub(sequence, index - 1, sub);
std::vector> tmpSubSeq;
for(std::vector &subSeq : sub) {
if(subSeq[subSeq.size() - 1] < sequence[index]) {
std::vector newSeq(subSeq);
newSeq.push_back(sequence[index]);
longestSubSeq = std::max(longestSubSeq, newSeq.size());
tmpSubSeq.push_back(newSeq);
}
}
std::copy(tmpSubSeq.begin(), tmpSubSeq.end(),
std::back_insert_iterator>>(sub));
return longestSubSeq;
}
int getLongestIncSub(const std::vector &sequence) {
std::vector> sub;
return getLongestIncSub(sequence, sequence.size() - 1, sub);
}
int main()
{
std::vector seq{0, 8, 2, 3, 7, 9};
std::cout << getLongestIncSub(seq);
return 0;
}