1007. Maximum Subsequence Sum (25)

来源:互联网 发布:ddms 数据库 编辑:程序博客网 时间:2024/05/16 12:37

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和负数输入的情况,在代码的注释中详解。

#include <stdio.h>#include <stdlib.h>int main(){   //maxSum是最大子列和,thisSum是当前查找的子列和,first,last是最大子列的头和尾的下标    int list[10001] = {0};    int n, i, maxSum = 0, thisSum = 0, first = 1, last, j, f = 0;    scanf("%d", &n);    for(i = 1; i <= n; i++)        scanf("%d", &list[i]);    last = n; //初始化    for(i = 1, j = 1; i <= n; i++) //j是当前子列头的下标,i是尾的下标    {        thisSum += list[i];        if(thisSum < 0) //当前子列和小于0就放掉这个子列,开始下一个子列。        {            thisSum = 0;            j = i + 1;        }        else if(maxSum < thisSum) //如果当前子列和大于最大子列和,就把当前子列的和以及它的尾        {   //赋值给最大子列            maxSum = thisSum;            last = i;            first = j;        }        else if(maxSum == 0 && thisSum == 0) //如果输入只有负数和0,就输出0 0 0            f = 1;     //因为0还是比负数要大,而且受到输出最小下标的值,在这种情况下,    }                 //最大子列只有0。    if(f)        printf("0 0 0");    else        printf("%d %d %d", maxSum, list[first], list[last]);    return 0;}
0 0
原创粉丝点击