2018-08-09

2018-08-09  本文已影响0人  Ping接未来

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

问题描述

有一个由呢个整数组成的数列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)

上一篇下一篇

猜你喜欢

热点阅读