[英]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
。
有人能发现我的错误吗?
只有在找到下一个最长序列时才重置length
和sum
,但每次完成测试序列时都应该重置它们:
现在,您的代码会累积length
和sum
直到超过maxLength
但length
和sum
是测试变量,在测试每个可能的子序列时需要重置它们。
此外,您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--;
}
}
// ...
注意:我为maxLength
和maxSum
添加了初始化,以使用尽可能小的整数来计算负数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.