1007 Maximum Subsequence Sum (25分)
题面:
Given a sequence of K integers { N1, N2, …, NK}. A continuous subsequence is defined to be { Ni, Ni+1, …, Nj} where 1≤i≤j≤K. The Maximum Subsequence is the continuous subsequence which has the largest sum of its elements. For example, given sequence { -2, 11, -4, 13, -5, -2 }, its maximum subsequence is { 11, -4, 13 } with the largest sum being 20.
Now you are supposed to find the largest sum, together with the first and the last numbers of the maximum subsequence.
Input Specification:
Each input file contains one test case. Each case occupies two lines. The first line contains a positive integer K (≤10000). The second line contains K numbers, separated by a space.
Output Specification:
For each test case, output in one line the largest sum, together with the first and the last numbers of the maximum subsequence. The numbers must be separated by one space, but there must be no extra space at the end of a line. In case that the maximum subsequence is not unique, output the one with the smallest indices i and j (as shown by the sample case). If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.
Sample Input:
10
-10 1 2 3 4 -5 -23 3 7 -21
Sample Output:
10 1 4
题目的大意是给出一个序列,从这个序列中提取出一个和最大的连续子序列,输出这个子序列的和,子序列的第一个数和最后一个数。
坑点:
- 子序列不唯一,提取的子序列要保证 第一个数和最后一个数的下标最小
- 若结果为负则需要输出零 和 整个序列的第一个数和最后一个数
解决思路:
- 从数列的第一个数开始向后累加,若累加的值小于0就将其更新为0,继续向后加和,若累加值大于当前的最大子列和就将其更新为当前的累加值,同时更新子列的起始下标和终止下标。
代码如下
#include <stdio.h>
#include <stdlib.h>
#define MAXISIZE 10001
int main(int argc, char const *argv[])
{
int k;
scanf("%d",&k);
int List[MAXISIZE];
for (int i = 0; i < k; ++i)//输入初始序列
{
scanf("%d",&List[i]);
}
int start,end,ts,te;
int max=-MAXISIZE;//初始化子列和和累加值为负无穷
int tmax=-MAXISIZE;
for (int i = 0; i < k; ++i)
{
if (tmax<0)//如果累加值小于零就开始更新累加值,累加值起止下标。注意此处应为小于号非小于等于以保证序列起止下标最小
{
tmax=List[i];
ts=i;
te=i;
}
else//否则继续累加,更新终止坐标
{
tmax+=List[i];
te=i;
}
if (tmax>max)//如果当前累加值大于最大子列和,更新之
{
max=tmax;
start=ts;
end=te;
}
}
//输出
if (max>=0)
{
printf("%d %d %d",max,List[start],List[end]);
}
else
{
printf("%d %d %d",0,List[0],List[k-1]);
}
return 0;
}
应该没人看吧,就当是做笔记hhhh