最大子陣列和
最大子陣列和(Maximum Subarray Problem)是一個著名的動態規劃問題,其目標是在一個給定的整數陣列中找到連續子陣列,其總和最大。
例如,給定一個陣列 [13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7]
,其中最大的子陣列和為 62
,這個子陣列是 [20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7]
。
解決這個問題的一種常見方法是使用動態規劃。我們可以定義一個狀態 f[i]
表示陣列 A[0..i]
的最大子陣列和。狀態轉移方程為:
f[i] = max(f[j] + A[i], A[i]), where j < i
初始狀態 f[0]
為 A[0]
。
這裡有一個Python的實現:
def maxSubArray(arr):
n = len(arr)
f = [float('-inf')] * n # 初始化所有狀態為負無窮大
f[0] = arr[0] # 初始狀態
for i in range(1, n):
f[i] = max(f[i-1] + arr[i], arr[i])
return f[-1]
# 示例
arr = [13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7]
print(maxSubArray(arr)) # 輸出:62
這個算法的時間複雜度為 O(n)
,空間複雜度為 O(n)
,其中 n
是陣列的大小。
另一種解決這個問題的方法是使用貪心算法,這就是著名的「貪心選擇子陣列和」(Greedy Subarray Sum)算法,也稱為「貪心選擇算法」(Greedy Choice Algorithm)。這個算法的基本思想是從陣列的開頭開始,不斷地選擇當前最大的元素,直到陣列的末尾。
這裡有一個Python的實現:
def maxSubArrayGreedy(arr):
n = len(arr)
max_ending_here = [0] * n # 初始化所有狀態為0
max_so_far = [0] * n # 初始化所有狀態為0
for i in range(n):
max_ending_here[i] = max(max_ending_here[i-1] + arr[i], arr[i])
max_so_far[i] = max(max_so_far[i-1], max_ending_here[i])
return max_so_far[-1]
# 示例
arr = [13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7]
print(maxSubArrayGreedy(arr)) # 輸出:62
這個算法的時間複雜度為 O(n)
,空間複雜度為 O(n)
。