求解最大子段和問題 分治 蠻力 dp

2021-10-04 08:52:38 字數 1934 閱讀 2118

【問題描述】給定乙個有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 ...