最大子段和问题
描述:
给定由n个整数组成的序列,求序列中子段的最大和,若所有整数均为负整数时定义最大子段和为0。例如, 当(a1,a2,a3,a4 ,a5,a6) = (-2,11,-4,13,-5,-2)时,最大子段和为: a2+a3+a4=20
输入格式:
第一行输入整数个数n(1≤n≤10000),再依次输入n个整数。
输出格式:
输出第一行为最大子段和,第二行为子段第一个数和最后一个数在整个序列中的位序。
输入样例:
6
-2 11 -4 13 -5 -2
输出样例:
20
2 4
import java.util.Scanner;
/*
* 最大子段和问题。给定由n个整数组成的序列,求序列中子段的最大和,若所有整数均为负整数时定义最大子段和为0。
*例如, 当(a1,a2,a3,a4 ,a5,a6) = (-2,11,-4,13,-5,-2)时,最大子段和为: a2+a3+a4=20
* */
public class Maximum_sub_segment_sum {//最大子段和问题
public static void main(String args[]){//穷举
int n,sum = 0,max = 0,fir = 0,last = 0;//字段个数 临时和 最大和 最大和的第一个位数 最大和的最后一个位数
int [] b = new int[50];
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
for(int i = 0;i < n; i++) {
b[i] = scanner.nextInt();
}
for(int i = 0; i < n;i++){
sum = b[i];
if(sum > max){
max = sum;
fir = i;
last = i;
}
for(int j = i + 1;j < n;j++){
sum+=b[j];
if(sum > max){
fir = i;
last = j;
max = sum;
}
}
sum = 0;
}
System.out.printf("%d\n%d %d",max,fir + 1,last + 1);
}
}