53. Maximum Subarray

求一个给定序列的最大连续子序列和,如[-2,1,-3,4,-1,2,1,-5,4]的最大连续子序列为[4, -1, 2, 1]
这是一个典型的动态规划问题,中文wiki页

public static int maxSubArray(int[] A) {
    int maxSoFar=A[0], maxEndingHere=A[0];
    for (int i=1;i<A.length;++i){
        maxEndingHere= Math.max(maxEndingHere+A[i],A[i]);
        maxSoFar=Math.max(maxSoFar, maxEndingHere); 
    }
    return maxSoFar;
}

这里假设有一个长度与原序列相同的整形数组dp,dp[i]表示原序列以i位置作为结尾时的子序列的最大和,那么当dp[i - 1] > 0时dp[i]所表示的最大和可以转化为dp[i - 1] + values[i],而如果dp[i - 1] < 0,则说明前面的和是负数,应该从下一位位置开始作为起点,即dp[i] = values[i]。这就是我们需要的转移方程。

public int max_subarray(int[] A){
    int[] dp = A.clone();
    int max=A[0];
    for(int i=1;i<A.length;i++){
        if(dp[i-1]>0){
            dp[i]=dp[i-1]+A[i];
        }
        max=Math.max(max,dp[i]);
    }
    return max;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容