最大子段和

2021-06-10 01:43:01 字數 1739 閱讀 9310

問題表述

n個數(可能是負數)組成的序列a1,a2,…an.求該序列

例如:  序列(-2,11,-4,13,-5,-2) ,最大子段和:

11 - 4 + 13=20。

(1)窮舉演算法: o(n3), o(n2)

(2)分治法:

將序列a[1:n]從n/2處截成兩段:a[1:n/2], a[n/2+1:n]

例項

三、最大子段和

問題表述

n個數(可能是負數)組成的序列a1,a2,…an.求該序列

也就是

例如:  序列(-2,11,-4,13,-5,-2) ,最大子段和:

11 - 4 + 13=20。

(1)窮舉演算法: o(n3), o(n2)

(2)分治法:

將序列a[1:n]從n/2處截成兩段:a[1:n/2], a[n/2+1:n]

一共存在三種情況:

a.最大子段和出現在左邊一段

b.最大子段和出現在右邊一段

c.最大子段和跨越中間的斷點

對於前兩種情況,只需繼續遞迴呼叫,而對於第三種情況:

那麼s1+s2是第三種情況的最優值。

(3)動態規劃法:

定義b[j]:

含義:從元素i開始,到元素j為止的所有的元素構成的子段有多個,這些子段中的子段和最大的那個。

那麼:如果:b[j-1] > 0, 那麼b[j] = b[j-1] + a[j]

如果:b[j-1] <= 0,那麼b[j] = a[j]

這樣,顯然,我們要求的最大子段和,是b[j]陣列中最大的那個元素。

#includeusing namespace std;

#define max(a, b) ((a) > (b)) ? (a) : (b)

// use dynamic programming

int use_dp(int array, int len)

return max;

}// use divide and conquer

int use_dac(int array, int left, int right)

for (i = mid + 1; i <= right; i++)

return max(left_sum, max(right_sum, rmax + lmax));

}void main()

; int len = sizeof(array) / sizeof(int);

cout << use_dac(array, 0, len - 1) <

最大子段和

設a 是n個整數的序列,稱為該序列的子串行,其中1 i j n.子串行的元素之和稱為a的子段和.例如,a 2,11,4,13,5,2 那麼它的子段和是 長度為1的子段和 2,11,4,13,5,2 長度為2的子段和 9,7,9,8,7 長度為3的子段和 5,20,4,6 長度為4的子段和 18,15...

最大子段和

再給頂的n個數的陣列中選出連續的若干個數,使得他們的和是最大的,即最大連續自序列和.列如.序列.1 2 3 1 6 5 9 結果 當取子串行 3,1,6,5,9 結果12 我的思路.1.最大連續子串行的開頭是在1.n之中.的最大連續和 2.求出以i,開頭的最大連續和,此時開頭已經確定了,那麼通過列舉...

最大子段和

問題描述 給定有n個整數 可能為負整數 組成的序列,a1,a2,an,求該序列如 最優值為 max上述假定的意思也就是說最大欄位和 只有乙個字段 要麼為0,要麼大於0 int maxsum int n,int a,int besti,int bestj 這樣下來就可以在i 1時找到其中的最大欄位和的...