给出一段序列,选出其中连续且非空的一段使得这段和最大。
输入格式:
输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度。
第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列。
输出格式:
输入文件maxsum1.out仅包括1个整数,为最大的子段和是多少。子段的最小长度为1。
输入样例#1:
7
2 -4 3 -1 2 -4 3
输出样例#1:
4
【样例说明】2 -4 3 -1 2 -4 3
【数据规模与约定】
对于40%的数据,有N ≤ 2000。
对于100%的数据,有N ≤ 200000。
对于这个题,我们可以考虑用贪心的做法来求解,首先我们可以认为,当一个数为负数时,当他加上一个数,仍然不如只算加上的那个数划算,所以我们可以将sum<0的时候吧sum变成0
然后在每个解中求最大值
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 using namespace std;
6 const int MAXN=200001;
7 int a[MAXN];
8 int main()
9 {
10 int n;
11 scanf("%d",&n);
12 for(int i=1;i<=n;i++)
13 scanf("%d",&a[i]);
14 int sum=0;
15 int ans=-100000;
16 for(int i=1;i<=n;i++)
17 {
18 sum+=a[i];
19 ans=max(ans,sum);
20 if(sum<0)sum=0;
21 }
22 printf("%d",ans);
23 return 0;
24 }