/**
 * @author wang
 * @description
 * 给定有可能负的整数 A1 A2 A3 ...An
 * 求 Ai+...+Ak  (即最大子序列和)的最大值   (0 =< i <= k <= n)
 * 如果所有整数为负数,则最大子序列和为 0
 * 
 * 关于这段代码的描述:
 * 在求最大子序列和时,假设第x个数加到thisSum中,导致thisSum<=0
 * 那么 x 之前的序列都可以放弃了,直接从 第x+1个整数开始重新计算thisSum.
 * 当thisSum > maxSum时,更新maxSum的值。
 * 
 * 这个算法在每一轮计算,都可以保证maxSum是 当前计算到的数组的最大子序列和。
 * 
 * @create 2021/1/3
 */

public class 最大子序列和 {
    public static void main(String[] args) {
        int[] a = {4,-3,5,-2,-1,2,6,-2};
        System.out.println(maxSubSum(a));
    }
    public static  int maxSubSum(int a[]){
        int maxSum = 0 ,thisSum = 0;

        for (int i = 0; i < a.length; i++) {
            
            thisSum += a[i];
            if (thisSum > maxSum){
                //将最大子序列和存入maxSum
                maxSum=thisSum;
            }
            else if (thisSum < 0){
                thisSum = 0;
            }
        }
        return maxSum;
    }
}