最大子序和算法

最大子序和(Maximum Subsequence Sum)問題是算法和數據結構中的一個經典問題。給定一個整數序列,找到該序列的一個子序列,使其和最大。這裡所說的子序列是指通過刪除一些(也可以不刪除)元素後得到的一個序列,刪除的元素可以是序列中的任意一些元素。

例如,給定序列 [-2, 11, -4, 13, -5, -2],其最大子序列和可以通過選擇 11, -4, 13 得到,即 11 - 4 + 13 = 20。雖然序列中還有其他正數,但是選擇 11, -4, 13 得到的和最大。

最大子序列和問題可以通過動態規劃算法來解決。動態規劃的基本思想是,將大問題分解為更小的、可管理的子問題,並通過存儲子問題的答案來避免重複計算。

下面是一個使用動態規劃解決最大子序列和問題的算法:

def max_subsequence_sum(sequence):
    n = len(sequence)
    # 創建一個數組來存儲子序列的最大和
    dp = [0] * n  # dp[i] 表示以 sequence[i] 結尾的子序列的最大和

    # 初始化 dp[0],即以第一個元素結尾的子序列的最大和
    dp[0] = sequence[0]

    # 動態規劃算法
    for i in range(1, n):
        # 如果當前元素比對應的子序列和更大,更新子序列和
        if sequence[i] > dp[i - 1]:
            dp[i] = sequence[i]
        # 如果當前元素小於或等於對應的子序列和,更新子序列和
        else:
            dp[i] = dp[i - 1] + sequence[i]

    # 返回整個序列的最大子序列和
    return max(dp)

# 示例
sequence = [-2, 11, -4, 13, -5, -2]
print(max_subsequence_sum(sequence))  # 輸出應該是 20

在這個算法中,dp[i] 表示以 sequence[0], sequence[1], ..., sequence[i-1] 結尾的子序列的最大和。通過這種方式,我們可以避免重複計算,因為每個 dp[i] 只依賴於 dp[i-1]

請注意,這個算法的時間複雜度和空間複雜度都是 O(n),其中 n 是序列的長度。對於某些特定的序列,可能存在更高效的算法,但這個算法是通用的,適用於任何整數序列。