DS_Maximum Subsequence Sum

2017-10-14  本文已影响0人  Peanut_Butter

在PTA上刷DS的题目,有些问题和细节,放上来和大家分享和讨论

最大子列和问题

Given a sequence of K integers { N1, N​2, ..., N​K}. A continuous subsequence is defined to be { N​i​​ , N​i+1, ..., N​j} 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

解答

// 在线处理法搜索子列最大和
#include<stdio.h>

int max3(int list[],int n)
{
    int Thissum,Maxsum;
    int temp,beg,end;
    Thissum = Maxsum = 0;
    beg = temp = 0;end = n-1;
    int i;
    for(i = 0;i < n;i++)
    {
        Thissum += list[i];
        if (Thissum > Maxsum)
        {
            Maxsum = Thissum;
            beg = temp;
            end = i;
        }
        else if (Thissum < 0)
            {
                Thissum = 0;
                temp = i+1;
            }
    }
    if(Maxsum>0)
        printf("%d %d %d",Maxsum,list[beg],list[end]);
    else
        printf("0 %d %d",list[0],list[n-1]);
    return 0;
}
int main()
{
    int n,i;
    scanf("%d",&n);
    int list[n];
    for(i=0;i<n;i++)
        scanf("%d",list+i);
    max3(list,n);
    return 0;
}

上一篇下一篇

猜你喜欢

热点阅读