【问题标题】:To find all longest increasing subsequences given an array of integers - Dynamic Programming在给定整数数组的情况下找到所有最长递增子序列 - 动态规划
【发布时间】:2014-12-15 00:12:50
【问题描述】:

我正在研究动态编程,遇到了这个问题,我必须打印出所有最长的子序列。给定一个数组,可能有不止一个最长的子序列。 我尝试的程序只会给我一个最长的子序列,但不会给我所有最长的子序列。如何获得所有最长的子序列?

//Initially I create two arrays of the length of the given input array 

public static void LIS(int[] input) {

    String paths[] = new String[input.length];
    int[] size = new int[input.length];

    for(int i=0;i<input.length; i++) {
       paths[i] = input[i];
       size[i] = 1;
    }

    for(i=1; i<input.length ; i++) {

        for(j=i; j< i ; j++) {
            if(input[i] > input[j] && size[i] < size[j] + 1) {
                size[i] =  size[j] +1;
                paths[i] =  paths[j] + input[i] + ""

                if (maxlength < size[i]) {
                    maxlength = size[i];
                }
            }
        }
    }
}

我的示例输入[] = 1,8,10,3,7,12,15

使用上述算法,我得到最长的子序列为 1,8,10,12,15

我也应该得到 1,3,7,12,15

如何修改代码来获得这个?

【问题讨论】:

  • 您的代码无法编译。你能发布正确的吗

标签: java algorithm data-structures dynamic-programming


【解决方案1】:

如果您想修改此代码,您可以存储任何元素的所有可能的前任; 来自您的代码:

for(i=1; i<input.length ; i++) {

    for(j=i; j< i ; j++) {
        //if(input[i] > input[j] && size[i] < size[j] + 1) {
        if(input[i] > input[j] && size[i] <= size[j] + 1) {
            size[i] =  size[j] +1;
            //paths[i] =  paths[j] + input[i] + ""
            if (size[i] < size[j] + 1 )
               //empty p[i]
            p[i].push(j);

            if (maxlength < size[i]) {
                maxlength = size[i];
            }
        }
    }
}

然后你需要恢复所有可能的子序列

【讨论】:

    猜你喜欢
    • 2017-04-26
    • 1970-01-01
    • 2016-05-02
    • 2011-02-07
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 2015-10-28
    • 2011-10-18
    相关资源
    最近更新 更多