【每天一道PAT】 1007 Maximum Subsequence Sum

思路

两种方法,一种方法暴力求解
一种方法实时读入,当当前相加和小于0时,当前相加和更新为0。

方法1 求出全部最大序列和
第五个测试点啊,理解有问题?不知道哪儿错了,数据为全是负数和0。希望有明白的读者加以指正。

#include <cstdio>
int num[10005];
int main()
{
    int N;//数据个数
    int this_sum=0, max_sum=0;//当前相加和、最大和
    int m,n,temp;//记录子序列的左右边界下标
    int count=0;//计数
    scanf("%d", &N);
    for (int i = 0; i < N; ++i)
    {
        scanf("%d",&num[i]);
        if(num[i]<=0) count++;
    }
    if(count==N)
    {
        printf("0 %d %d",num[0],num[N-1]);
        return 0;
    }
    m = n =0;
    for (int i = 0; i < N; ++i)
    {
        this_sum = 0;
        for (int j = i; j < N; ++j)
        {
            this_sum+=num[j];
            if(this_sum >max_sum)
            {
                max_sum =this_sum;
                n = i;
                m = j;
            }
        }

    }
        printf("%d %d %d",max_sum, num[n], num[m]);

}

方法2 实时处理

#include <cstdio>
int num[10005];
int main()
{
    int N;

    int this_sum=0, max_sum=0;
    int m,n,temp;
    int count=0;
    scanf("%d", &N);
    for (int i = 0; i < N; ++i)
    {
        scanf("%d",&num[i]);
        if(num[i]<0) count++;
    }
    if(count==N)
    {
        printf("0 %d %d\n",num[0],num[N-1]);
        return 0;
    }
    this_sum=max_sum=num[0];
    m = n =0;
    for (int i = 1; i < N; ++i)
    {
        if(this_sum < 0 )
        {
            this_sum = 0;
            temp = i;
        }
        this_sum += num[i];
        if(this_sum >max_sum)
        {
            max_sum =this_sum;
            n = temp;
            m = i;
        }

    }
    if(max_sum <0)
        printf("0 %d %d", num[0], num[N-1]);
    else
        printf("%d %d %d",max_sum, num[n], num[m]);

}

猜你喜欢

转载自www.cnblogs.com/xinyuLee404/p/12657024.html