動態規劃最大子序列和

最大子序列和問題(Maximum Subsequence Sum Problem)是動態規劃中的一個經典問題。給定一個數列 (a_1, a_2, \ldots, an),我們要找到一個非空的子序列 (a{i1}, a{i2}, \ldots, a{i_k}),使得這些元素的和最大。這裡的子序列是指從原數列中取出的一些元素,這些元素的相鄰位置在原數列中也是相鄰的。

動態規劃解決這個問題的關鍵是狀態轉移方程。我們定義狀態 (dp[i][j]) 為考慮前 (i) 個元素時,以第 (i) 個元素為結束的最大子序列和。狀態 (dp[i][j]) 可以根據以下規則來計算:

初始狀態 (dp[0][j] = 0),因為在考慮前 (0) 個元素時,任何子序列的和都不會大於零。

最後,我們要找到的最大子序列和就是 (dp[n][j]),其中 (j) 從 (1) 到 (n) 遍歷。

以下是一個簡單的Python實現:

def max_subsequence_sum(arr):
    n = len(arr)
    dp = [[0] * (n + 1) for _ in range(n + 1)]
    for i in range(n + 1):
        for j in range(1, n + 1):
            if arr[i - 1] >= 0:
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + arr[i - 1]
            else:
                dp[i][j] = dp[i - 1][j]
    return dp[n][n]

# Example usage:
arr = [1, -2, 3, 10, -4, 7, 2]
print(max_subsequence_sum(arr))  # Output: 17 (1 + 3 + 10 + 7)

這個算法的時間複雜度為 (O(n^2)),空間複雜度為 (O(n^2)),因為我們使用了 (n) 行 (n) 列的動態規劃表。對於較大的數列,這個算法可能會很慢。一個優化的版本可以使用貪心算法來找到最大子序列和,時間複雜度為 (O(n))。