最大子段和

题目描述

给出一个长度为 【洛谷 P1115】最大子段和 题解(贪心算法)_ci 的序列 【洛谷 P1115】最大子段和 题解(贪心算法)_ci_02,选出其中连续且非空的一段使得这段和最大。

输入格式

第一行是一个整数,表示序列的长度 【洛谷 P1115】最大子段和 题解(贪心算法)_ci

第二行有 【洛谷 P1115】最大子段和 题解(贪心算法)_ci 个整数,第 【洛谷 P1115】最大子段和 题解(贪心算法)_子段_05 个整数表示序列的第 【洛谷 P1115】最大子段和 题解(贪心算法)_子段_05 个数字 【洛谷 P1115】最大子段和 题解(贪心算法)_子段_07

输出格式

输出一行一个整数表示答案。

样例 #1

样例输入 #1

7
2 -4 3 -1 2 -4 3

样例输出 #1

4

提示

样例 1 解释

选取 【洛谷 P1115】最大子段和 题解(贪心算法)_数据_08 子段 【洛谷 P1115】最大子段和 题解(贪心算法)_数据_09,其和为 【洛谷 P1115】最大子段和 题解(贪心算法)_ci_10

数据规模与约定
  • 对于 【洛谷 P1115】最大子段和 题解(贪心算法)_ci_11 的数据,保证 【洛谷 P1115】最大子段和 题解(贪心算法)_子段_12
  • 对于 【洛谷 P1115】最大子段和 题解(贪心算法)_ci_13 的数据,保证 【洛谷 P1115】最大子段和 题解(贪心算法)_ci_14【洛谷 P1115】最大子段和 题解(贪心算法)_ci_15

思路

在遍历数组a时,累加每个元素的值,并在每次更新ans时使用max函数选择当前最大的子段和。

同时,如果当前的子段和sum小于0,则说明当前的子段对后面的结果没有贡献,因此将sum重置为0,从下一个元素重新开始计算。


AC代码

#include <iostream>
#include <algorithm>
#define AUTHOR "HEX9CF"
using namespace std;

const int maxn = 2e5 + 5;

int main()
{
    int n;
    int a[maxn];
    int sum, ans;
    cin >> n;
    sum = 0;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
        if (!i)
        {
            ans = a[0];
        }
        sum += a[i];
        ans = max(ans, sum);
        if (sum < 0)
        {
            sum = 0;
        }
    }
    cout << ans << endl;
    return 0;
}