最大子段和
求给定序列的最大连续序列的和
- 问题描述
给定n个数(可以为负数)的序列(a1,a2,…,an),求$max(0,\sum_{k=i}^{j} a_k)\space 1≤i≤j≤n$
- 子问题界定
设前边界为1,后边界为i,且$C[i]$是以$A[i]$为结尾的连续子段的和的最大值.
- 递推方程
$$C[i]=max(C[i-1]+A[i],A[i]) \space i=2,…,n$$
$$C[1]=max(A[1],0)$$
- 时间复杂度:$O(n)$
- 代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include<iostream> using namespace std;
int MaxSubsequenceSum(const int A[], int n) { int tempSum = 0; int maxSum = 0; for (int j = 0;j < n;j++) { tempSum = (tempSum + A[j]) > A[j] ? (tempSum + A[j]) : A[j]; if (tempSum > maxSum) maxSum = tempSum;
} return maxSum; }
int main() { const int a[] = { 4, -3, 5, -2, -1, 2, 6, -2 }; int maxSubSum = MaxSubsequenceSum(a, 8); cout << "The max subsequence sum of a is: " << maxSubSum << endl; system("pause"); return 0; }
|
Last updated: