一:程序代码
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数组,把回滚后的数据复制到当前数值中
通过输入非整形字符可以单步执行程序到程序截止。
原文:https://www.cnblogs.com/1502762920-com/p/10770619.html