1. 程式人生 > >最大子段和問題(java描述)

最大子段和問題(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

+a2,a2+a3,......,an-1+an),並將選擇出來的這兩個數的和與max比較,如果比max大,就把它賦給max;把序列中的連續的兩個數都遍歷一遍;然後可以選擇連續的三個、四個......n個數,重複上述操作,最後判斷max的大小,如果max<0,就把0賦給max,否則max就是所求值。

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(){
int sum=0;

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;
}
}
}