最大子序列和
最大子序列和問題是計算機科學和算法中的一個經典問題。給定一個序列,找到該序列的一個子序列,其和最大。子序列是指通過刪除一些(可能不刪除)原始序列中的元素得到的序列,並且刪除的元素不需要是連續的。
例如,對於序列[2, 1, -3, 4, -1, 2, 1, -5, 4]
,其最大子序列和可以通過選擇相鄰的正值得到,即[4, -1, 2, 1]
,其和為6
。這個子序列不是原始序列的連續部分,因為它跳過了-3
和-5
。
這個問題可以通過動態規劃來解決。我們可以定義一個數組dp
,其中dp[i]
表示以a[i]
結尾的最大子序列和。我們可以通過以下方式計算這個數組:
- 如果
a[i] > 0
,則dp[i] = a[i] + dp[i - 1]
(如果i > 0
),表示如果a[i]
是子序列的一部分,則其和是a[i]
加上其前面元素的最大子序列和。 - 如果
a[i] < 0
,則dp[i] = dp[i - 1]
(如果i > 0
),表示如果a[i]
不是子序列的一部分,則其和不變。
我們可以通過遍歷序列來計算這個數組,然後返回dp[n - 1]
,其中n
是序列的長度。
以下是一個簡單的Python實現:
def max_subsequence_sum(arr):
n = len(arr)
dp = [0] * n
dp[0] = arr[0]
for i in range(1, n):
if arr[i] > 0:
dp[i] = arr[i] + dp[i - 1]
else:
dp[i] = dp[i - 1]
return max(dp)
# 示例
arr = [2, 1, -3, 4, -1, 2, 1, -5, 4]
print(max_subsequence_sum(arr)) # 輸出應該是 6
這個算法的時間複雜度和空間複雜度都是O(n)
,其中n
是序列的長度。