L - 最大子段和

N个整数组成的序列a 1 1,a 2 2,a 3 3,…,a n n  求该序列如a i i+a i+1 i+1+…+a j j的连续子段和的最大值。当所给的整数均为负数时和为0。
例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。
Input
第1行:整数序列的长度N(2 <= N <= 50000) 
第2 - N + 1行:N个整数(-10^9 <= A i i <= 10^9)
Output
输出最大子段和。
Sample Input
6
-2
11
-4
13
-5
-2
Sample Output

20

分析:这个题思路很简单,就是依次将各个数累加,如果结果大于等于0继续加,如果小于0则重新置零开始累加,那么这样求得的和一定是最大的,道理不用解释了吧,只有大于零的数继续累加才会对最大值产生增益的效果,上代码:



import java.util.*;
public class Main {
   static Scanner in = new Scanner(System.in);
   static int[] a = new int[50005];
   static int n;
	public static void main(String[] args) {
		while(in.hasNext()){
			n = in.nextInt();
			for(int i=1;i<=n;i++)
				a[i]=in.nextInt();
			long ans=0,sum=0;//由于结果可能会超过整数最大范围

			  for (int i=1;i<=n;i++)  {  
			        if(sum>0)  
			          sum+=a[i]; //大于0累加 
			        else  
			          sum=a[i]; //否则还是原来的数,这个条件会把小于0的数筛去 
			    ans = Math.max(sum, ans);
			  }  
		   System.out.println(ans);			
	}
  }
}

第一次没有AC就是没注意到结果可能会超范围。。,这个错误希望不要再犯了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值