Problem P03. [算法课分治] 找到最大子序和

image

求最大子序列和:

  1. 如果前面的序列为正数,后面紧接着出现一个最大子序列,那这个最大子序列加上一个相邻的正数数列才会是最大子序列。
  2. 要注意如果全为负数,那么最小的那个负数就是最大的子序列和
#include<iostream>
#include<bits/stdc++.h>
#include<cstdio>

using namespace std;

int n;

int main()
{
    scanf("%d", &n);
    long long valmax = 0;
    long long val = 0;
    int valmin = 0;
    while(n--)
    {
        int x;
        scanf("%d", &x);
        val += x;
        if (valmax < val)
        {
            valmax = val;
        }
        else if (val < 0)
        {
            if (valmin == 0)
            {
                valmin = val;
            }
            else if (valmin < val)
            {
                valmin = val;
            }
            val = 0;
        }
    }
    if (valmax == 0)
    {
        printf("%d", valmin);
    }
    else
    {
        printf("%lld", valmax);
    }

    return 0;
}

posted @ 2022-09-02 14:39  白缺  阅读(102)  评论(0编辑  收藏  举报