最大子陣列和

最大子陣列和(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)