【問題描述】給定乙個有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。
蠻力法
窮舉所有連續子串行來得到。
設含有n個整數的序列a[0…n-1],窮舉所有的連續子串行a[i…j],求出它的所有元素之和thissum,並通過比較將最大值存放在maxsum中,最後返回maxsum。
改進的蠻力法
分治法
long
maxsubsum3
(int a[
],int left,int right)
//求a[left..right]序列中最大子段和
int mid=
(left+right)/2
;//求中間位置
maxleftsum=
maxsubsum3
(a,left,mid)
;//求左邊
maxrightsum=
maxsubsum3
(a,mid+
1,right)
;//求右邊
maxleftbordersum=
0,leftbordersum=0;
for(i=mid;i>=left;i--
)//求出以左邊加上a[mid]元素
maxrightbordersum=
0,rightbordersum=0;
for(j=mid+
1;j<=right;j++
)//求出a[mid]右邊元素
最優演算法(就遍歷一次)
從頭開始掃瞄陣列a,用sum(初值為0)記錄當前子串行之和,用max(初值為0)記錄最大連續子串行和。
如果掃瞄中遇到負數,當前子串行和sum將會減小,若sum為負數,表明前面已經掃瞄的那個子串行可以拋棄了,則放棄這個子串行,重新開始下乙個子串行的分析,並置sum為0。
若這個子串行和sum不斷增加,那麼最大子串行和max也不斷增加。
類似動態規劃
求解 最大子段和問題
1.通過分治法求解最大子段和問題 遞迴來求解 include define n0 10 int maxsum int a n0 int left,int right 出口 center left right 2 leftsum maxsum a,left,center rightsum maxsum...
最大子段和問題 蠻力法 分治法 動態規劃法
蠻力法 int maxsum1 int a,int n return maxsum 分治法 int maxsum2 int left,int right,int a sum 0 right max 0 求右邊的最大值 for i center 1 i right i sum right max le...
最大子段和 (dp
n個整數組成的序列a1,a2,a3,ann,求該序列如ai ai 1 aj的連續子段和的最大值。當所給的整數均為負數時和為0。例如 2,11,4,13,5,2,和最大的子段為 11,4,13。和為20。第1行 整數序列的長度n 2 n 50000 第2 n 1行 n個整數 10 9 ai 10 9 ...