我想在整数数组中找到最大子序列S(h,k)
。我已经有了代码(在Java中)来查找最大值并且工作正常,但是如何从以下内容中获取两个索引h
和k
?
int []a = {-2, 1, -3, 4, -1, 2, 1, -5, 4 };
int max_so_far = 0, max_ending_here = 0;
for(int i=0; i<a.length; i++) {
max_ending_here = Math.max(0, max_ending_here + a[i]);
max_so_far = Math.max(max_so_far, max_ending_here);
}
System.out.println("The maximal sum of subsequence is = "+max_so_far)";
答案 0 :(得分:0)
您可以通过存储改进后的最后一个索引max_so_far
和&#34;解开&#34;来获取子序列本身。后面的序列:
int []a = {-2, 1, -3, 4, -1, 2, 1, -5, 4 };
int max_so_far = 0, max_ending_here = 0, index_max = 0;
for(int i=0; i<a.length; i++) {
max_ending_here = Math.max(0, max_ending_here + a[i]);
if (max_so_far < max_ending_here) {
max_so_far = max_ending_here;
index_max = i;
}
}
System.out.print("The maximal sum of subsequence is = "+max_so_far);
int j = index_max;
while (j >= 0 && max_so_far > 0) {
max_so_far -= a[j--];
}
System.out.println(", from = "+(j+1)+" to "+index_max+", inclusive");
注意:使用标记从后面展开是动态编程算法中的常见主题。在您的简单情况下,index_max
扮演一个特殊标记的角色,从中您可以向后查找将max_so_far
运行为零的索引。
答案 1 :(得分:0)
感谢 Shreyas Sarvothama 和 dasblinkenligh t的答案。我在Uekav Chokshi的geeksforgeeks.org网站上找到了一个很好的解决方案。
解决方案是:
int []a = {-2, 1, -3, 4, -1, 2, 1, -5, 4 };
int max_so_far = a[0], max_ending_here = a[0];
int curStartIndex = 0;
int maxStartIndex = 0;
int maxEndIndex = 0;
for(int i=1; i<a.length; i++) {
max_ending_here = Math.max(a[i], max_ending_here + a[i]);
if(max_ending_here > max_so_far){
max_so_far = max_ending_here;
maxStartIndex = curStartIndex;
maxEndIndex = i;
}
if(max_ending_here < 0){
curStartIndex = i+1;
}
}