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

给定条件的最长子序列

濮阳原
2023-03-14

我认为这个问题可以用动态规划来解决,但我不能提出递归关系。

共有1个答案

苗信鸥
2023-03-14

假设您正在处理数组A,选择要包含在子序列中的值。在每个步骤中,您可以(a)包括当前值,或者(b)不包括它。如果您记住了这两个选项中较好的一个,那么应该可以使动态编程工作。

在伪代码中,函数应该如下所示:

int longest_subseq(ix, available_weight, last_val):
    # Parameters:
    # ix = an index into array A (assumed to have global scope)
    # available_weight = the remaining weight avaiable for the subsequence
    #                    starting at ix
    # last_val = the last value in the subsequence from A[0] through A[ix-1]

    # When first called, create a DP array of 10^5 × 51 × 51 elements
    # (This will use about 1GB of memory, which I assume is OK)
    if DP is undefined:
        DP = new array(100001, 51, 51)
        initialize every element of DP to -1

    # Return memoized value if available
    v = DP[ix, available_weight, last_val]
    if v >= 0:
        return v

    # Check for end conditions
    if ix == n or available_weight == 0:
        return 0

    # Otherwise you have two options; either include A[ix] in the
    # subsequence, or don't include it
    len0 = longest_subseq(ix+1, available_weight, last_val)
    if abs(A[ix] - last_val) > available_weight:
        DP[ix, available_weight, last_val] = len0
        return len0
    len1 = 1 + longest_subseq(ix+1, available_weight-abs(A[ix]-last_val), A[ix])
    if len0 > len(1):
        DP[ix, available_weight, last_val] = len0
        return len0
    else:
        DP[ix, available_weight, last_val] = len1
        return len1

如果然后调用longest_subseq(0,k,a[0]),则函数应在合理的时间内返回正确的答案。

 类似资料:
  • 然而,我意识到我真正想解决的问题有点不同。给定一个固定的k,我需要确保公共子序列只涉及长度正好为k的子串。例如,设置k=2,并让这两个字符串为 我需要的子序列是“。 是否可以修改动态规划解来解决这个问题?

  • 这里,在这段代码中,它打印序列的最大子序列的长度,该序列先增加后减少,或者反之亦然。 例如: 输入:1,11,2,10,4,5,2,1 如增-减-增或减-增-减 示例: 投入:7 16 1 6 20 17 7 18 25 1 25 21 11 5 29 11 3 3 26 19

  • 例如,我们得到长度为5(n=5)的字符串“Number”,它由从1到a的所有数字组成(数字可以重复,但从1到a的所有数字都必须包含在字符串中,并且字符串的长度必须为n)。假设a=2并使用先前给定的条件生成示例性数字(或者更确切地说是数字序列),假设它是长度为5并由1和2组成的“12211”。现在让我们假设我们需要找到一个算法,该算法将在我们的字符串“Number”中找到所有可能的数字序列,其中每个

  • 在最多一个序列存在重复的情况下,可以将最长公共子序列问题转化为最长递增子序列问题。减少问题的过程说明在这里: 假设您有以下序列: 然后,创建一个整数序列S3,其中您必须将S2的每个元素的位置放在S1中(如果元素在S1中不存在,那么忽略那个元素)。在本例中: 这种方法是如何工作的?为什么这种约简解决了寻找最长公共子序列的问题?

  • 我试图找到最长回文子串问题的algo。

  • 我的问题是,这个问题有没有更好的解决办法?多谢.