最大子段和問題(java描述)
最大子段和問題:
1.問題描述:最大子段和問題就是:給定由n個整數(可能為負數)組成的序列a1,a2,a3......an,求該序列形如ai+ai+1+ai+2+...+aj的子段的最大和。當所有的整數均為負數時,定義其最大子段和為0,。例如,序列(a1,a2,a3,a4,a5,a6)=(-2,11,-4,13,-5,-2)的最大子段和為a2+a3+a4=20。
2.解決問題的思路:由問題描述可知,求最大子段和是要求隨求的數是連續的,而數的個數未知,那麼我們可以先從序列中選擇出一個數,並把選擇出來的數與變數max比較,如果比max大,就把它賦給max,把序列中的每個數都遍歷一遍,遍歷結束後,此時就可以得到序列中單個數的最大值;接著我們可以選擇連續的兩個數(a1
3.演算法實現(java描述):
public class MaxSum {
//形如陣列 -2 11 -4 13 -5 -2
//最大子欄位和為11~13=11+(-4)+13=20
//全域性陣列
static int []num={-2,11,-4,13,-5,-2};
//當前最大值
static int max=0;
//迴圈次數
static int count=0;
public static void main(String[] args) {
calSum();
System.out.println("最大子段和為:"+max);
System.out.println("執行次數為:"+count);
}
//求選項中的n個數字的和
public static int choosedNSum(int start,int n){
int sum=0;
for(int i=start;i<start+n;i++){
sum=sum+num[i];
count++;
}
return sum;
}
//遍歷迴圈陣列計算最大欄位和
public static void calSum(){
for(int i=1;i<=num.length;i++){
for(int j=0;j<=num.length-i;j++){
sum=choosedNSum(j,i);
if(sum>max){
max=sum;
}
}
}
if(max<=0){
max=0;
}
}
}