一:程序代码
package shuzu;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class xuexi {
public static void main(String[] args) {
int number;
System.out.println("请输入数组的长度");
Scanner sc=new Scanner(System.in);
number=sc.nextInt();
int array[]=new int[number];
System.out.println("请输入数组的值");
for(int i=0;i<number;i++) {
array[i]=sc.nextInt();
}//输入数组的值
int maxsum,maxstart;
maxsum=array[0];
maxstart=array[0];
int pointstart=1,pointend=1;
List<Integer> type1=new ArrayList<Integer>();
List<Integer> type2=new ArrayList<Integer>();
List<Integer> type3=new ArrayList<Integer>();
List<Integer> type4=new ArrayList<Integer>();
List<Integer> type5=new ArrayList<Integer>();
for(int i=1;i<number;i++)
{
type1.add(maxstart);
type2.add(maxsum);
type3.add(pointstart);
type4.add(pointend);
type5.add(i);
if(maxstart<0)
{
maxstart=0;
pointstart=i+1;
}
maxstart+=array[i];//两两组合求和
if(maxstart>maxsum)
{
maxsum=maxstart;
pointend=i+1;
}
System.out.println("第"+i+"步子数组的和的数值"+maxsum +" 位置是"+pointstart+"到"+pointend +" 检查的子集的个数是:"+i+" 总共有"+number+"个数据");
System.out.println("请输入你要回滚的层数,输入非数字的字符进入下一步");
int back=0;
if(sc.hasNextInt())
{
back=sc.nextInt();
maxstart=type1.get(back-1);
maxsum=type2.get(back-1);
pointstart=type3.get(back-1);
pointend=type4.get(back-1);
i=type5.get(back-1)-1;
}
else sc.next();
}
System.out.println("子数组的最大和为:");
System.out.println(maxsum);
}
}
程序实验结果截图:
设计思想:首先定义存储数据类型的变量,利用arraylist数组存储记录子数组最大值,以及子数组的开始数据位置和结束数据位置,还要存储子数组的个数
定义back变量通过输入整形数字确定回滚的步揍,
maxstart=type1.get(back-1);
maxsum=type2.get(back-1);
pointstart=type3.get(back-1);
pointend=type4.get(back-1);
i=type5.get(back-1)-1;
这些通过调用arraylist数组,把回滚后的数据复制到当前数值中
通过输入非整形字符可以单步执行程序到程序截止。