問題描述:
輸入一組整數,求出這組數字子序列和中最大值。也就是隻要求出最大子序列的和,不必求出最大的那個序列。例如:
序列:-2 11 -4 13 -5 -2,則最大子序列和爲20。
序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,則最大子序列和爲16。
/* seq:整數組,seqSize:整數組大小 */
int MaxSubSeqSum(int *seq, int seqSize)
{
int j;
int maxSum;
int tmpSum;
if ((0 == seq) || (seqSize < 1))
{
/* 出錯 */
return 0;
}
maxSum = seq[0];
tmpSum = seq[0];
/* 從第一個數開始,每次計算子序列和(包括一個數
的情況),並通過與當前最大值比較,更新當前最大值。
此時,如果子序列和小於0,說明只能重新往後查找
更大的子序列和 */
for (j = 1; j < seqSize; j++)
{
if (tmpSum > maxSum)
{
maxSum = tmpSum;
}
if (tmpSum < 0)
{
tmpSum = 0;
}
tmpSum += seq[j];
}
/* 處理加了最後一個數的tmpSum */
if (tmpSum > maxSum)
{
maxSum = tmpSum;
}
return maxSum;
}
測試用例:
-2, 11, -4, 13, -5, -2
-2, -11, -4, -13, -5, -2
-2, -11, 4, 13, -5, -2
0, -11, 4, 13, -5, -2
-6, 2, 4, -7, 5, 3, 2, -1, 6, -9, 10, -2
5, -11, 8, 3, -5, -2
5, -8, -3, 8, -3, -5, -2