zoukankan      html  css  js  c++  java
  • 【每天一道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
    ",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]);
    
    }
    

  • 相关阅读:
    linux自动清理30天之前的文件
    Oracle树查询及相关函数
    jackson循环引用导致序列化stackOverFlow的解决
    java核心技术36讲笔记
    Quartz学习
    Quartz学习
    java核心技术36讲
    git常用命令
    CTCall简介(后续会继续补充)
    自定义导航栏,隐藏导航栏底部的灰色线条
  • 原文地址:https://www.cnblogs.com/xinyuLee404/p/12657024.html
Copyright © 2011-2022 走看看