java - 给定整数数组找到所有最长的递增子序列 - 动态规划

标签 java algorithm data-structures dynamic-programming

我正在学习动态规划,我遇到了这个问题,我必须打印出所有最长的子序列。给定一个数组可能有不止一个最长的子序列。 我试过的程序只会给我一个最长的子序列,而不是所有最长的子序列。我如何获得所有最长的子序列?

//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

我如何修改代码才能得到这个?

最佳答案

如果你想修改这段代码,你可以为任何元素存储所有可能的前导; 从你的代码:

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

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

关于java - 给定整数数组找到所有最长的递增子序列 - 动态规划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26458424/

相关文章:

java - 发现按钮 IllegalStateException : Could not execute method of the activity

algorithm - 选择 n 个固定和的数字

.net - 事务队列的数据结构

algorithm - 在求和为目标值的二叉搜索树中查找路径

java - 在java中使用多态数组

java - 如何在java中将字符串转换为xml文件

java - 非基于套接字的 Java 服务器

algorithm - 求最近点对这七点的解释

python - 在 python 字典中插入或更新键

java - 操作复杂的 HashMap