https://oj.leetcode.com/problems/maximum-subarray/

http://blog.csdn.net/linhuanmars/article/details/21314059

public class Solution {
    public int maxSubArray(int[] A)
    {
        // Solution B:
        // return maxSubArray_Gready(A);
        
        // Solution A:
        return maxSubArray_DP(A);
    }
    
    ////////////////////
    // Solution A: DP
    //
    private int maxSubArray_DP(int[] A)
    {
        if(A==null || A.length==0)
            return 0;   // Invalid input
            
        int global = A[0];
        int local = A[0];
        
        for (int i = 1 ; i < A.length ; i ++)
        {
            local = Math.max(A[i], local + A[i]);
            global = Math.max(global, local);
        }
        return global;
    }
    
    ////////////////////
    // Solution B: Gready
    //
    private int maxSubArray_Gready(int[] A)
    {
        if (A == null)
            return -1;  // Invalid.
            
        boolean found = false;
        int max = Integer.MIN_VALUE;
        int curSum = 0;
        for (int i = 0 ; i < A.length ; i ++)
        {
            curSum += A[i];
            if (curSum >= 0)
            {
                if (curSum > max)
                {
                    max = curSum;
                    found = true;
                }
            }
            else
            {
                curSum = 0;
            }
        }
        
        if (found)
            return max;
        
        max = Integer.MIN_VALUE;
        for (int i : A)
        {
            max = Math.max(max, i);
        }

        return max;
    }
}