一、问题分析
如果采用暴力解决,即考虑子段的情况总数为1+2+...+n=O(n^2)。考虑动态规划算法,可以实现O(n)算法复杂度。
动态规划思想:
可以将一个大问题(N个元素数组)转化为一个较小的问题(N-1个元素的数组)。假设已经知道(A[1], ...,A[n-1])中和最大的一段数组之和为All[1],并且已经知道
(A[1],...,A[n-1])中包含A[1]的和最大的一段数组为Start[1]。那么不难看出 (A[0], ..., A[n-1])中问题的解All[0] = max{ A[0], A[0] + start[1], All[1] }。
这是从后向前的理解方式,也可以从前往后理解,即下面的程序:
二、程序设计
三、程序结果
如果序列全是负数的话,其实就是在选择最大值