繁体   English   中英

最长递增子序列的长度和总和

[英]Length and sum of longest increasing subsequence

我想计算给定数组t最长子序列的总和和长度。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class so {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] s = br.readLine().split(" ");
        br.close();
        int[] t = new int[s.length];
        for (int i = 0; i < s.length; i++) {
            t[i] = Integer.parseInt(s[i]);
        }
        int length = 1;
        int sum = t[0];
        int maxSum = 0;
        int maxLength = 0;

        for (int i = 1; i < t.length; i++) {
            for (; i < t.length && t[i - 1] <= t[i]; i++) {
                length++;
                sum += t[i];
                System.out.print(t[i] + " ");
            }

            if (length > maxLength) {
                maxLength = length;
                maxSum = sum;
                length = 1;
                sum = 0;
                i--;
            }
        }
        System.out.println("sum is " + maxSum + " length is " + maxLength);
    }
}

对于数字1 1 7 3 2 0 0 4 5 5 6 2 1我得到输出:

sum is 20 length is 6

但是对于相反顺序的相同数字1 2 6 5 5 4 0 0 2 3 7 1 1我得到输出:

sum is 17 length is 6不是真的,因为我应该得到sum is 12 length is 5

有人能发现我的错误吗?

只有在找到下一个最长序列时才重置lengthsum ,但每次完成测试序列时应该重置它们:

现在,您的代码会累积lengthsum直到超过maxLengthlengthsum是测试变量,在测试每个可能的子序列时需要重置它们。

此外,您sum变量需要重置为t[i - 1]处的当前测试值,而不是0 即使存在此错误,您仍能获得正确结果的原因是因为两个输入的 LIS 中的第一项都是0

如果我们输入类似的东西(用1 s 替换第一个输入中的两个0 s):

1 1 7 3 2 1 1 4 5 5 6 2 1

输出是:

sum is 21 length is 6

但总和应该是22

事实上,一种稍微简洁的方法是在循环开始时执行测试变量的初始化,而不是在循环外部初始化然后在内部重置:

// ...
int length, sum, maxSum = Integer.MIN_VALUE, maxLength = Integer.MIN_VALUE;

for (int i = 1; i < t.length; i++) {
   // initialize test variables
   length = 1;
   sum = t[i - 1];
   for (; i < t.length && t[i - 1] <= t[i]; i++) {
       length++;
       sum += t[i];
       System.out.print(t[i] + " ");
   }

   if (length > maxLength) {
       maxLength = length;
       maxSum = sum;
       i--;
   }
}
// ...

注意:我为maxLengthmaxSum添加了初始化,以使用尽可能小的整数来计算负数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM