輸入一個整數數組,數組中有正數也有負數,找到具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和以及連續子數組的起始位置。
要求:用動態規劃策略實現,並分析其時間複雜度。
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]+" ");
}
}
}
運行截圖: