最大子序列的和

最大子序列和問題是一個經典的動態規劃問題。給定一個整數序列,我們要找到該序列的一個子序列,使得它的和最大。這裡的子序列是指通過刪除一些(可能不刪除)原始序列中的元素得到的序列,刪除的元素之間不能有間隙(即刪除的元素必須是連續的)。

例如,對於序列[10, 5, -3, 2, -1],它的一個最大子序列和是10 + 5 + 2 = 17,這個子序列是[10, 5, 2]

動態規劃算法通過定義以下狀態來解決問題:

狀態轉移方程為:

初始狀態為 f[0] = a[0]

偽代碼如下:

function maxSubsequenceSum(a):
    n = length(a)
    f = new array of size n
    f[0] = a[0]
    for i from 1 to n-1:
        if a[i] > 0 or (a[i] < 0 and f[i-1] <= 0):
            f[i] = f[i-1] + a[i]
        else:
            f[i] = a[i]
    return f[n-1]

時間複雜度為 O(n),空間複雜度為 O(n),其中 n 是序列的長度。

注意,如果序列中存在負數,則最大子序列和可能小於序列中所有元素的和。如果所有元素都是非負的,則最大子序列和等於整個序列的和。