注意点:
1. 一道需要思考才会写的简单的题目。思想是这样的,有两个保存的序列,一个是历史最大序列用于保存最大结果,一个是当前最大序列用于保存到当前位置的最大序列。从0到n考虑是否要将某个数加入序列中,比如考虑第i位,由于要找的是一个连续的序列,所以考虑第i位是否是序列的一部分的时候,第i-1位肯定是已经被包括进序列了,所以对加上第i位后的值进行判断,如果是一个正数,说明这个序列可以继续增长,和当前记录的最大序列相比,更新最大序列;若果和是一个负数,说明这个序列已经没用了(到第i位的最大是一个负数,那么第i+1位加上一个负数肯定都会更小吧),所以当前序列要进行更新,从第i+1位重新开始。
2. 注意输出的是序列和以及开始位置结束位置的数值,不是对应的index,给的example刚好index和对应index的数值相同,容易误导导致错误。
代码如下:
#include <iostream>
#include <string.h>
#include <stack>
#include <math.h>
#include <vector>
#include <algorithm>
#define MAXNUM 0x3f3f3f3f
#define MAXLEN 10001
#define STARTTIME 8 * 60 * 60
#define ENDTIME 21 * 60 * 60
#define max(a, b) (((a) > (b)) ? (a) : (b))
using namespace std;
typedef struct SubSeq
{
int s, e;
int sum;
SubSeq(): sum(0){};
};
int num[10001];
int main()
{
int K;
int i, j;
int temp;
SubSeq maxS, maxRS;
scanf("%d", &K);
for(i = 0; i < K; ++ i)
scanf("%d", &num[i]);
maxS.s = maxS.e = 0;
maxS.sum = -1;
maxRS.s = maxRS.e = 0;
maxRS.sum = 0;
for(i = 0; i < K; ++ i)
{
maxRS.sum += num[i];
if(maxRS.sum < 0)
{
maxRS.s = i + 1;
maxRS.sum = 0;
continue;
}
if(maxRS.sum > maxS.sum)
{
maxS = maxRS;
maxS.e = i;
}
}
if(maxS.sum < 0)
printf("0 %d %d", num[0], num[K - 1]);
else
printf("%d %d %d", maxS.sum, num[maxS.s], num[maxS.e]);
return 0;
}