2018-08-09

动态规划之最大子段和问题

问题描述

有一个由呢个整数组成的数列A={a1,a2,......,an},截取其中从i - j开始的子段并计算字段和,求最大的字段和为多少?
例如A={1,3,-5,3,-2,5,-4,3}
则其最大字段和为3+(-2)+5 =6

使用动态规划算法求解问题

假设最大子段和设为M
设从1到j中包括a[j]的最大子段和为b[j]
所以有:
b[j] = max{b[j-1]+a[j],a[j]}
M = max{b[j]} ( 1=<j<=n)

代码求解

public class MaxSum {
    public static void maxSum(int[]arr){
        int sum=0,b=arr[0];
        for(int i=1;i<arr.length;i++){
            if(b>0) b+=arr[i];
            else b = arr[i];
            if(b>sum) sum=b;
        }
        System.out.println(sum);
    }
    public static void main(String[]args){
        int[] arr={1,3,-5,3,-2,5,-4,3};
        maxSum(arr);
    }
}

算法复杂度为O(n)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容