I have the following problem:
Find the longest increasing subsequence of a given sequence / array.
In other words, find a subsequence of array in which the subsequence’s elements are in strictly increasing order, and in which the subsequence is as long as possible. This subsequence is not necessarily contiguous, or unique. In this case, we only care about the length of the longest increasing subsequence.
Example :
Input : [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15] Output : 6 The sequence : [0, 2, 6, 9, 13, 15] or [0, 4, 6, 9, 11, 15] or [0, 4, 6, 9, 13, 15]
This is a DP problem and I do have some issue at the memorization step. Here is my code:
public int lis(final List<Integer> a) {
return maxIncreasing(0, Integer.MIN_VALUE, a);
}
HashMap<Integer, Integer> memo = new HashMap<>();
private int maxIncreasing(int index, int lastElt, final List<Integer> a) {
if(memo.containsKey(index)) return memo.get(index);
// end?
if(index >= a.size()) return 0;
int weTake = Integer.MIN_VALUE;
// can we take it?
if(a.get(index) > lastElt) {
// take it or don't
weTake = maxIncreasing(index + 1, a.get(index), a) + 1;
}
int weDoNot = maxIncreasing(index + 1, lastElt, a);
int max = Math.max(weTake, weDoNot);
memo.put(index, max);
return max;
}
Without the memo HashMap in place I have the correct result, I am not sure why this is giving me the wrong result once in place.
Thanks.