蓝桥杯 ADV-16 算法提高 和最大子序列

放肆的年华 提交于 2020-02-06 05:24:29

算法提高 和最大子序列  

时间限制:1.0s   内存限制:512.0MB

 

问题描述
  对于一个给定的长度为N的整数序列A,它的“子序列”的定义是:A中非空的一段连续的元素(整数)。你要完成的任务是,在所有可能的子序列中,找到一个子序列,该子序列中所有元素的和是最大的(跟其他所有子序列相比)。程序要求你输出这个最大值。

 

输入格式
  输入文件的第一行包含一个整数N,第二行包含N个整数,表示A。
  其中
  1 <= N <= 100000
  -10000 <= A[i] <=  10000

 

输出格式
  输出仅包含一个整数,表示你算出的答案。

 

样例输入

5

3 -2 3 -5 4

 

样例输出

4

 

分析:设

为以

为结尾的连续子数组中的最大和,其递推关系式为

该式可以这样理解:以

为结尾的、有最大和的连续子数组要么是以

为开头、以

为结尾的单一元素数组,要么是以从

之间的某个元素为开始,经过

,并以

​​​​​​​为结尾的数组。该式的初始条件为

题目要求的最大和即为

 

#include <stdio.h>

int max(int a, int b)
{
    return a > b ? a : b;
}

int main()
{
    int N;
    int A[100005] = { 0 };

    scanf("%d", &N);
    for (int i = 0; i < N; ++i)
        scanf("%d", &A[i]);

    int current_f = A[0], max_f = A[0];
    for (int i = 1; i < N; ++i)
    {
        current_f = max(A[i], current_f + A[i]);
        if (current_f > max_f)
            max_f = current_f;
    }
    printf("%d", max_f);

    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!