最长的后续序列,动态编程

时间:2016-12-11 20:36:14

标签: java algorithm dynamic-programming

我有以下问题:

  

找到给定序列/数组的增长最长的子序列。

     

换句话说,找到子序列所在的数组的子序列   元素是严格递增的顺序,其中   子序列尽可能长。这个子序列不是   必然是连续的,或独特的。在这种情况下,我们只关心   最长的子序列的长度。

     

示例:

     

输入:[0,8,4,12,2,10,6,14,1,9,5,13,​​3,11,7,15]输出   :6序列:[0,2,6,9,13,15]或[0,4,6,9,11,15]或[0,   4,6,9,13,15]

这是一个DP问题,我在记忆步骤中遇到了一些问题。 这是我的代码:

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;
}

如果没有备忘录HashMap,我会得到正确的结果,我不知道为什么这会给我错误的结果。

感谢。

1 个答案:

答案 0 :(得分:0)

那是因为你没有照顾lastElt。基本上,根据index值,您可以为给定的lastElt提供多个解决方案。因此,您Key的{​​{1}}必须包含memoindex

你可以这样做:

lastElt