题目:
/*
*思路:在整个个序列中,如果它的某个子序列的和zsum小于0,则将zsum加上其他的子序列则其结果不可能成为最大和
*将序列从第一个开始,若它到某(n)个值的和小于0,则它是第一个子序列,然后从(n+1)开始,...一直将序列分为m个不同长度的子序列
*先求出第一个子序列的最大和max1,然后计算第二个子序列的最大和max2...计算第m个子序列的最大和maxm,max1到maxn的最大值则为所求max
*起始位置则为该子序列的起始位置,结束位置则为该子序列的结束位置
*
*算法分析:
*(1)将子从第一个数开始求和zSum,若zSum>max(子序列的最大和,初始化为第一个值),则将zSum的值赋值给max,
*此时该子序列的下标的起始(start)和结束位置(end)为所求的起始和结束位置。(start,j)
*(2)当zSum<0时,则重新开始下一个子序列的计算,zSum=0,此时要标记开始位置temp(temp=j+1,前一个子序列的结束下标+1),当满足(1)时,将temp赋值给start
*未知变量arr
*
*/
import java.util.Scanner;
public class Main1003 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();
for (int i = 1; i <= T; i++) //控制行
{
int n=sc.nextInt(); //控制一行输入多少个数
int a[]=new int [n];
for(int j=0; j<a.length; j++) {
a[j]=sc.nextInt();
}
//输出结果
System.out.println("Case "+i+":");
// System.out.println(max+" "+start+" "+end);
maxZArr(a);
if(i!=T)
System.out.println();
}
}
public static void maxZArr(int arr[]) {
int zSum=0; //初始化子序列的和为0
int max=arr[0]; //初始化子序列最大和为max
int start=0; //初始化子序列开始的下标为0
int end=0; //初始化子序列结束的下标为0
int temp=0; //初始化子序列标记的下标为0(用来标记另一个子序列开始的坐标值)
for(int i=0; i<arr.length; i++) {
zSum+=arr[i]; //子序列求和,从第一个开始
if (zSum>max) { //如果子序列的和大于最大值,则将子序列的和赋给最大值,并且确定开始和结束的位置
max=zSum;
start=temp;
end=i;
}
if(zSum<0) {
zSum=0; //当子序列的和<0时,将子序列和置0,开始计算下一个子序列的和
temp=i+1; //标记后一个子序列的开始下标
}
}
System.out.println(max+" "+(start+1)+" "+(end+1));
}
}
思路来源:百度代码(可用)
import java.util.Scanner;
public class Main1003
{
public static void main(String[] args)
{
Scanner s=new Scanner(System.in);
int cas=s.nextInt();
for (int i = 1; i <= cas; i++) //控制行
{
int n=s.nextInt(); //控制一行输入多少个数
int sum = 0, max = -0xfffffff; //设置默认初始化,sum为序列的和,max为子序列的最大和
int start=1, last=1, temp = 1; //star为子序列的起始位置,last为子序列的结束位置
for (int j= 1; j<= n; j++) //相当于遍历输入的一行数
{
int a = s.nextInt(); //输入数据
sum += a; //
System.out.println("j:"+j);
if (sum > max)
{
max = sum;
start = temp;
last = j;
System.out.println("for:"+max+" "+start+" "+last+" temp:"+temp+" sum:"+sum);
}
if (sum < 0)
{
temp = j+ 1;
sum = 0;
System.out.println("for2:"+max+" "+start+" "+last+" temp:"+temp+" sum"+sum);
}
}
//输出结果
System.out.println("Case "+i+":");
System.out.println(max+" "+start+" "+last);
if(i!=cas)
System.out.println();
}
}
}