一、最大子段和
設F(i) 爲 數組中以a[i]結尾的最大子段和, 那麼只需要遍歷 0~n 找到max{F(0) F(1) ...... F(n-1)}
F(i) = a[i] F(i-1) < 0
F(i-1) + a[i]
二 、最大環形數組子段和
思路一:把環形最大子段和可以看做兩部分。 第一部分——正常最大子段和,第二部分——跨越a[0] 和 a[n-1]的最大子段和。 那麼第一部分可以用O(n) 求出,第二部分我們
從a[0] 開始計算 0~n-2 的最大和,記錄結束位置position1。 再從a[n-1] 開始計算 n-1~1的最大和,記錄結束位置 position2。
position2 > position1 則第二部分最大和 a[0] + ... a[position1] + a[position2] + ...a[n-1]
position2 <= position1 則第二部分最大和 a[0] + ....... a[n-1]
思路二: 數組總和 - 最小子段和
三、最大M段和
問題 :從數組中確定M個不相交的子序列,使這M個子序列的和最大!
設F(i, j) 爲 在前i個元素中選j個子段的最大和,且包含元素a[j]. 那麼對於a[j] , 1) a[j] 自己組成第 j 子段 ; 2) a[j] 包含於第 j 子段中;
對於情況1) F(i , j) = max{所有 j-1 子段} + a[i] = F(k, j - 1) + a[j] k 屬於[j-1, i-1]
對於情況2) F(i , j) = F(i-1, j) + a[i]
顯然 F(i, j) 取值爲情況1 與 情況2的最大者
四 、二維子段和
思路把二維的壓縮爲一維
五、絕對值系列
最大絕對值子段和: 要麼正的最大,要麼負的最小。 所以問題解等於max{abs(最大子段和), abs(最小子段和)}
最小絕對值字段和:
1) 構造數組 b[0] = a[0];
b[1] = a[0] + a[1];
...........
b[n-1] = a[0] + ......+a[n-1];
2) 對b排序(保留index 信息)
3) 求排序後數組相鄰位置差最小