蠻力法 求解最大連續子串行和問題

2021-10-23 21:00:51 字數 2138 閱讀 2490

題目:

給定乙個有n(n>=1)個整數的序列,求解其中最大連續子串行的和。規定乙個序列的最大子串行和至少為0,若結果小於0,則其結果為0

例:序列(-2,11,-4,13,-5,-2)的最大子串行和為20

序列(-6,2,4,-7,5,3,2,-1,6,-9,10,-2)的最大子串行和為16。

思路一:窮舉法

設含有n個整數的序列a[0 … n-1]和其中任何連續子串行a[i … j](i<=j,0<=i<=n-1,i**1:

#include

int maxsum(int a[

],int n)

}return maxsum;

}int main();

int n=sizeof(a)/sizeof(a[0]);

int b=

; int m=sizeof(b)/sizeof(b[0]);

printf(

"a序列最大和:%ld\n",maxsum(a,n))

; printf(

"b序列最大和:%ld\n",maxsum(b,m))

思路二:窮舉法在求兩個相鄰子串行和時它們之間是相關聯的

例:sum(a[i … j])表示a[i … j]中所有元素的和,sum(a[0 … 3])=a[0]+a[1]+a[2]+a[3],而sum(a[4]=a[0]+a[1]+a[2]+a[3]+a[4])

這樣做,在前者計算出來後求後者時只需在前者的基礎上加a[4]即可,不需要每次重複計算。

sum(a[i ... j]

)=0; //a[i ... j] 沒有元素

sum(a[i ... j]

)=a[i ... j-1]+a[j] //a[i ... j] 有元素

**2:

#include

int maxsum(int a[

],int n)

}return maxsum;

}int main();

int n=sizeof(a)/sizeof(a[0]);

int b=

; int m=sizeof(b)/sizeof(b[0]);

printf(

"a序列最大和:%ld\n",maxsum(a,n))

; printf(

"b序列最大和:%ld\n",maxsum(b,m))

思路三:窮舉法從頭開始掃瞄陣列a,用cursum(初值為0)記錄當前子串行之和,用maxsum(初值為0)記錄最大連續子串行之和。

如果在掃瞄中遇到負數,當前子串行和curmax會減小,

若curmax為負數,表明前面已經掃瞄到的那個子串行可以拋棄,則放棄這個子串行,重新開始下乙個子串行的分析,並置maxsum=0.

若這個子串行和cursum不斷增加,那麼最大子串行和maxsum也不斷增加.

**3:

#include

int maxsum(int a[

],int n)

return maxsum;

}int main();

int n=sizeof(a)/sizeof(a[0]);

int b=

; int m=sizeof(b)/sizeof(b[0]);

printf(

"a序列最大和:%ld\n",maxsum(a,n))

; printf(

"b序列最大和:%ld\n",maxsum(b,m))

蠻力法求解最大連續子串行和問題

給定乙個有n n 1 個整數的序列,要求求出其中最大連續子串行的和。例如 序列 2,11,4,13,5,2 的最大子串行和為20 序列 6,2,4,7,5,3,2,1,6,9,10,2 的最大子串行和為16。規定乙個序列最大連續子串行和至少是0 看成0個元素構成的子串行 如果小於0,其結果為0。設含...

求解最大連續子串行和問題

解法1 maxsubsum1 a,n 演算法中用三重迴圈來窮舉所有的連續子串行,計算它們的和,時間複雜度為t n o n 3 1 long maxsubsum1 int a,intn 2 14if thissum maxsum maxsum thissum 15 16 17return maxsum...

最大連續子串行和 問題

為了證書,重新開始刷資料結構,原本也就是學的一知半解的,上來就給我來了乙個最大子串行和問題,搞得我很無奈,貌似hdu1003就是這個問題.第一 重新定義乙個新的sum陣列,然後進行儲存連續子串行的和,遇到前面的加和sum i 1 小於0,就直接讓sum i a i include include i...