这是PTA练习题上的关于最大子列和的第二道编程题的解答。相比于第一题,它的要求有所提高,即:
1.输出最大子列和
2.输出最大子列的第一个和最后一个数字。
3.为保证唯一性,若有两子列的子列和相等,取第一个。
4.当数列中全为负数,输出子列和为0,且首元素输出第一个元素,尾元素输出最后一个元素。
下为题目链接
01-复杂度2 Maximum Subsequence Sum (25分)
代码实现如下:
#include <stdio.h>
#define MAX 100000ul
int MaxSubsequenceSum(int *p, int N, int *start, int *end)
{
int i = 0, count = 0;
int tmp_start = 0;
int ThisSum = 0, MaxSum = 0;
for (i = 0; i < N; i++)
{
ThisSum += *(p + i);
if (ThisSum < 0)
{
count++;
ThisSum = 0;
tmp_start = i + 1;
}
else if (ThisSum > MaxSum)
{
MaxSum = ThisSum;
*start = *(p + tmp_start);
*end = *(p + i);
}
}
if (count == N)
{
MaxSum = 0;
*start = *(p + 0);
*end = *(p + N - 1);
}
return MaxSum;
}
int main(void)
{
int i;
long int k = 0;
int arr[MAX] = { 0 };
int start = 0, end = 0;
scanf("%d", &k);
for (i = 0; i < k; i++)
{
scanf("%d", &arr[i]);
}
printf("%d ", MaxSubsequenceSum(arr, k, &start, &end));
printf("%d %d", start, end);
return 0;
}