給定 A = [a0, a1, …, an-1],如何使得 slice 的和 sum(A[p], A[p+1], …, A[q]) 有最大值 (slice長度可以為0) ?有個知名的 Kadane’s Algorithm 可以解決這個問題。
目錄
Kadane’s Algorithm
如果已知 A[:i]
的 max sum,那麼 A[:i+1]
的 max sum 必定包含或不包含 A[:i]
的 prefix。
對每個 A
內的元素,求目前位置 i
所能達到的 sum 最大值,令其為 max_ending_here
。
包含 prefix 的情況下,max_ending_here
等於 prefix 加上當前元素 a
。
不包含 prefix 的情況下,max_ending_here
為 0,因為不包含的情況,表示 max_ending_here + a
小於 0,所以我們可以直接捨棄掉 prefix 和當前元素 a
,令 max_ending_here
歸零,從下一個元素開始累積 sum。
def max_slice(A):
max_ending_here = result = 0
for a in A:
max_ending_here = max(0, max_ending_here + a)
result = max(result, max_ending_here)
return result