問題表述
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時找到其中的最大欄位和的...