package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param array int整型一维数组 
 * @return int整型
*/
func FindGreatestSumOfSubArray( array []int ) int {
    // write code here
    // 直接动态规划
    // dp[i] 代表到达当前下标的子数组最大和
    // dp[0] = array[0]
	// 递推表达式:判断是和之前子数组组合在一起的和更大,还是当前元素自己组成子数组更大
  	// -1 -1 2 对于第三个元素来说,它的最大子数组肯定是不需要前面那部分子数组的
  	// 1 1 2 对于第三个元素来说,它的最大子数组肯定是需要包含前面大部分子数组的
    // dp[i] = max(dp[i-1]+array[i], array[i])
    if len(array) == 0 {
        return 0
    }

    dp := make([]int, len(array))
    dp[0] = array[0]
    ans := dp[0]

    for i := 1; i < len(array); i++ {
        dp[i] = max(dp[i-1]+array[i], array[i])
        if dp[i] > ans {
            ans = dp[i]
        }
    }

    return ans  
}

func max(a, b int) int {
    if a < b {
        return b
    }

    return a
}