当前位置: 首页 > 知识库问答 >
问题:

最长增子序列动态规划

韦原
2023-03-14

我有以下问题:

示例:

输入:[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,11,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;
}

多谢了。

共有1个答案

朱华皓
2023-03-14

这是因为您没有处理lastelt。基本上,对于给定的index可以有多个解决方案,具体取决于lastelt值。因此,您的备忘录必须有一个包含索引Lastelt

你可以这样做:

    class Key {
        final int index;
        final int lastEl;

        Key(int index, int lastEl) {
            this.index = index;
            this.lastEl = lastEl;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            Key key = (Key) o;

            if (index != key.index) return false;
            return lastEl == key.lastEl;

        }

        @Override
        public int hashCode() {
            int result = index;
            result = 31 * result + lastEl;
            return result;
        }
    }

    public int lis(final List<Integer> a) {
        return maxIncreasing(0, Integer.MIN_VALUE, a);
    }
    HashMap<Key, Integer> memo = new HashMap<>();
    private int maxIncreasing(int index, int lastElt, final List<Integer> a) {
        Key key = new Key(index ,lastElt);
        if(memo.containsKey(key)) return memo.get(key);
        // 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(key, max);
        return max;
    }
 类似资料:
  • 我正在寻找最长的常见递增子序列问题的解决方案。如果你不熟悉,这里有一个链接。LCIS 这个问题基本上可以归结为两个不同的问题。“最长公共子序列”和“最长递增子序列”。这是最长公共子序列的递归解决方案: 基于此和这里找到的一般递归公式,我一直在尝试实现该算法,以便可以使用动态规划。 显然,这并没有给出正确的解决方案。任何帮助都将不胜感激。 例如,如果我给它两个序列{1,2,4,5}和{12, 1,

  • 最长递增子序列 题目描述 给定一个长度为N的数组a0,a1,a2…,an-1,找出一个最长的单调递增子序列(注:递增的意思是对于任意的i<j,都满足ai<aj,此外子序列的意思是不要求连续,顺序不乱即可)。例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8},长度为4。 分析与解法 解法一:转换为最长公共子序列问题 比如原数组为 A{5,

  • 我正在复习在寻找两个等长字符串的最长公共子序列的上下文中讨论动态规划的笔记。有问题的算法输出长度(而不是子字符串)。 所以我有两个字符串,说: S=ABAZDC,T=BACBAD 最长的公共子序列是ABAD(子字符串不必是相邻的字母) 算法如下,其中LCS[i,j]表示S[1..i]和T[1..j]的最长公共子序列: 我的笔记声称你可以填写一个表格,其中每个字符串都沿着一个轴写。比如: B A C

  • 给定n个正整数的数组。这是一个寻找给定数组的最大和子序列的和的程序,使得子序列中的整数按升序排列。我试图实现基于这个YouTube视频的代码,我不知道我做错了什么。

  • 我在阅读了允许K个异常的最长递增子序列后创建了这个线程。我意识到提问的人并没有真正理解这个问题,因为他指的是一个链接,该链接解决了“允许一次更改的最长递增子数组”问题。所以他得到的答案实际上与李的问题无关。 假设给定一个长度为N的数组A。查找允许K个异常的最长递增子序列。 示例:N=9,K=1 A=[3,9,4,5,8,6,1,3,7] 答案:7 说明: 最长递增子序列为:3,4,5,8(或6),

  • 我试图为最长公共子序列写一个动态规划算法。返回应该是这个子序列的长度。但是我的算法总是返回0。我找不到错误。