算法提高 和最大子序列
时间限制: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;
}
来源:CSDN
作者:liulizhi1996
链接:https://blog.csdn.net/liulizhi1996/article/details/104184630