最大子序列的和
最大子序列和問題是一個經典的動態規劃問題。給定一個整數序列,我們要找到該序列的一個子序列,使得它的和最大。這裡的子序列是指通過刪除一些(可能不刪除)原始序列中的元素得到的序列,刪除的元素之間不能有間隙(即刪除的元素必須是連續的)。
例如,對於序列[10, 5, -3, 2, -1]
,它的一個最大子序列和是10 + 5 + 2 = 17
,這個子序列是[10, 5, 2]
。
動態規劃算法通過定義以下狀態來解決問題:
f[i]
表示以a[i]
結尾的最大子序列和。
狀態轉移方程為:
- 如果
a[i] > 0
或者a[i]
是負數但f[i-1] <= 0
,則f[i] = f[i-1] + a[i]
。 - 如果
a[i] < 0
且f[i-1] > 0
,則f[i] = a[i]
。
初始狀態為 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 是序列的長度。
注意,如果序列中存在負數,則最大子序列和可能小於序列中所有元素的和。如果所有元素都是非負的,則最大子序列和等於整個序列的和。