代码:
#include <stdio.h>
#define MaxN 100000
//下面这句不加的话visual stdio 2019会报错,粘贴到拼题A时需注释掉它
#pragma warning( disable : 4996)
/***01 - 复杂度2 Maximum Subsequence Sum(25 分)***/
//全局变量,方便函数处理后传出
int LeftNumber = 0;
int LeftLocationTemp = 0;
int RightNumber = 0;
int flag = -1;//用于记录输入序列中是否有0
//a为传入数组名,K为数组长度
//3方法为在线处理法
int MaxSeqSum3(int a[], int K);
int main()
{
int t;
int N;
scanf("%d", &N);
int test[MaxN];
for (t = 0; t <= N - 1; t++) {
scanf("%d", &test[t]);
if (test[t] == 0)
flag = 0;
}
int result = MaxSeqSum3(test, N);
printf("%d %d %d", result, LeftNumber, RightNumber);
return 0;
}
//3方法为在线处理法
int MaxSeqSum3(int a[], int K) {
int ThisSum = 0;
int MaxSum = 0;
int i;
for (i = 0; i <= K - 1; i++) {
ThisSum = ThisSum + a[i];
if (ThisSum > MaxSum) {
MaxSum = ThisSum;
RightNumber = a[i];
LeftNumber = a[LeftLocationTemp];
//printf("RightNumber:%d\n LeftNumber:%d\n", RightNumber,LeftNumber);
}
else if (ThisSum < 0) {
ThisSum = 0;
LeftLocationTemp = i + 1;
//printf("LeftLocationTemp:%d\n", LeftLocationTemp);
}
}
//printf("i=%d\n", i);
//对应序列中全为负数或0的情况
if (MaxSum == 0) {
if (flag == 0) {
LeftNumber = 0;
RightNumber = 0;
}
else {
LeftNumber = a[0];
RightNumber = a[i - 1];
}
//printf("L:%d R:%d\n", LeftNumber, RightNumber);
}
return MaxSum;
}
运行结果: