输入一个整数数组,数组中有正数也有负数,找到具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和以及连续子数组的起始位置。
要求:用动态规划策略实现,并分析其时间复杂度。
public class Continuous {
public static void main(String[] args) {
// TODO Auto-generated method stub
int []a= {1,-2,4,5,-2,8,3,-2,6,3,7,-1};
int []d = new int [12];
int []rec = new int [12];
int p=0,q=0;
d[11]=-1;
rec[11]=11;
for (int i =11-1; i >=0;i--) {
if(d[i+1]>0) {
d[i]=d[i+1]+a[i];
rec[i]=rec[i+1];
if(d[i]>p) {
p=d[i];
q=i;
}
}else {
d[i]=a[i];
rec[i]=i;
}
}
System.out.println("最后的D数组为:");
for (int j = d.length-1; j >=0; j--) {
System.out.print(" d["+j+"]=="+d[j]);
}System.out.println();
System.out.println("最后的Rec数组为");
for (int k = rec.length-1; k >=0; k--) {
System.out.print(" rec["+k+"]=="+rec[k]);
}System.out.println();
System.out.println("子数组中最大为:"+p);
System.out.println("最大子数组为第"+(q+1)+"个数到第"+(rec[q]+1)+"个数");
System.out.print("最大子数组为:");
for (int i = q; i <= rec[q]; i++) {
System.out.print(a[i]+" ");
}
}
}
运行截图: