using System;
using System.Collections.Generic;


class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型一维数组 
     * @return int整型
     */
    public int FindGreatestSumOfSubArray (List<int> array) {
        // write code here
        int ans=-101;
        int sum=0;
        for(int i=0;i<array.Count;i++)
        {
            sum+=array[i];
            ans=ans>sum?ans:sum;//Math.Max(ans, sum);
            sum=sum>0?sum:0;//Math.Max(sum, 0);
        }
        return ans;
    }
}
经典动态规划问题了。
动态规划关键在于状态更新:递推
假设一个数组,第一个数为正数,那么必然要加到我们的临时求和里面(为什么要有临时求和,后面再说),第二个数是正的我们当然加入,如果是负的,那还加不加入呢?
设想第一个数很大100,第二个数-2,后面都是1,比如 100,-2,1,1,1,1,那我们当然不能因为第二个数是-2就丢掉,从第三个数重新开始求和,因为100实在太大了,即使后面有负数
出现也不要紧,所以我们在加第三个数时,还是会变大。那么什么时候抛弃开头,从新开始求和呢?
假设数组是这样的:
2,-30,1,1,1,1,1,3.
因为-30太小,以至于成为震哥哥数组和的累赘,那么我们必然抛弃。
所以敏锐一点就是:当当前和还是正数的时候,我们就不更新求和起始点位置,因为你可以把前面一段整个起来当成一个数。
而实际上,一边走下来,最后的求和不一定最大,所以每次更新后都要和历史最大比较一次。