洛谷P1115 最大子段和

P1115 最大子段和

给出一段序列,选出其中连续且非空的一段使得这段和最大。

输入输出格式

输入格式:

第一行是一个正整数N,表示了序列的长度。

第二行包含N个绝对值不大于10000的整数Ai,描述了这段序列。

输出格式:

一个整数,为最大的子段和是多少。子段的最小长度为1。

输入输出样例

输入样例#1: 

7
2 -4 3 -1 2 -4 3

输出样例#1: 

4

因为子段和是连续的一段数字,所以,我们可以先设第一个数为最大值,

如果将这串数字依次相加,如果比最大值大,那么将最大值换为现在的值

如果和出现了小于0的情况那么再加只会比原来的数小,此时,将子段的头

变成下一个数即可,代码如下

#include<stdio.h>
int main()
{
	int n;
	
	scanf("%d", &n);
	
	int sum = 0, ans = 0;
	
	for(int i=0; i<n; i++)
	{
		
		int a;
		
		scanf("%d", &a);    
		
		sum = sum + a;      //计算子段和 
		
		if(i == 0)        //先将第一个数赋值为子段和的开头 
			
			ans = sum;
		
		if(sum > ans)     //当子段和要大于最大值时,改变最大值 
		
			ans = sum;
		
		if(sum < 0)      //当和变成负数时,将子段和清零,重新开始加 
			
			sum = 0;
	}
	if(sum > ans && ans >= 0 && sum >= 0) //可能出现一串数字全为负数的情况 
	
		ans = sum;
	
	printf("%d\n", ans);
}

猜你喜欢

转载自blog.csdn.net/w__000000wbt/article/details/85034622