今天做了一個程序,是實現結對編程的小項目,項目是尋找一組數組中最大的一組子數組(條件是數組必須連續)。通過我們模擬一組數據:
例如:int a[]={9,8,-5,4,3}
首先是選定一個初始值假如是a[0],則第二個數是a[0]+a[1]........可以這樣理解:
即第一層從a[0]開始 設置一個初始最大值:max
Sum1=a[0]; // max=sum1
Sum2=a[0]+a[1]; //sum2=sum1+a[1]; if(sum2>max) max=sum2;
Sum3=a[0]+a[1]+a[2].... //sum3=sum2+a[2]; if(sum3>max) max=sum3;
第二層從a[1]開始
Sum4=a[1]; //if(sum4>max) max=sum4;
Sum5=a[1]+a[2]; //sum5=sum4+a[2]; if(sum5>max) max=sum5
Sum6=a[1]+a[2]+a[3]....... //sum6=sum5+a[3]; if(sum6>max) max=sum6
....................
然后通過每一層進行比較,得出一層的Max,與下層繼續比較,直到找到最大相鄰的子數組的和。
算法模擬:
假設數組為a[];
package com.su.test; public class Second { public static void main(String args[]) { int a[]={-1,-2,4,3,-2}; //測試用例 int length=a.length; int cur=a[0]; int max=a[0]; for(int i=0;i<length;i++) { if(cur<0) cur=0; cur+=a[i]; if(cur>max) max=cur; } System.out.println(max); } }
這種算法很好充分利用了動態規划解決問題。而且算法的時間復雜度為O(n).