18708 最大子段和
Description
一个整数序列,选出其中连续且非空的一段使得这段和最大。
注意当题目要求输入输出的数据量很大时,尽量使用scanf和printf。 c++提供的cin和cout速度比较慢,有可能在读取数据和输出数据时导致超时。
输入格式
第一行是一个正整数N,表示了序列的长度(0=<N<=200000)。
第二行包含N个绝对值不大于10000的整数ai。
输出格式
一个整数,为最大的子段和。子段的最小长度为1。数据确保结果在类型int范围内。
输入样例
7
2 -4 3 -1 2 -4 3
输出样例
4
提示
【样例说明】
2,-4,3,-1,2,-4,3中,最大的子段和为4,该子段为第三元素至第五元素,即3,-1,2。
PS:动态规划
//动态规划
#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int n,x,ma = -100001;
cin >> n;
int a[n+5],s[n+5];
for(int i = 0;i < n;i++){
cin >> a[i];
}
s[0] = a[0];
for(int i = 1;i < n - 2;i++){
if(s[i - 1] > 0) s[i] = s[i - 1] + a[i];//如果上一段和大于0,累加a[i]
else s[i] = a[i];//从a[i]开始重新求和
ma = max(s[i],ma);//存最大的每个元素开头的最大子段和
}
cout << ma << endl;
return 0;
}
本文详细解析了18708最大子段和问题,通过动态规划算法来解决如何在一个整数序列中找出连续且非空的一段使其和最大。文章提供了完整的代码实现及样例解释。
1052

被折叠的 条评论
为什么被折叠?



