问题描述:
给定一个整数数组a[0~n],求数组a的子数组,使其元素和为最大。
问题分析:
方法一:可以用普通的方法枚举所有的子数组,然后求出最大的子数组和,时间复杂度为O(n*n)。
方法二:问题描述符合动态规划最优子结构的要求。
设b[i]表示以a[i]结尾 的子数组的最大子段和,即:
b[i]=max{sum(a[j~k])},其中0<=j<=i,j<=k<=i。
因此对于数组a[0~n]的最大字段和为max{b[i]},其中0<=i<n。
在计算b[i]时,可以考虑以下三种情况:
1,b[i] = b[i-1]+a[i],当b[i-1]>0时,这时候的b[i]中包含a[i]。
2,b[i] = a[i],当b[i-1]<=0,这时候以a[i]重新作为b[i]的起点。
3,b[i]不包含a[i]的情况,这种情况在计算b[i]之前已经计算处结果,保存在b[0~i-1]中。最后计算max{b[i]}时会考虑到。
b[i] = max{ b[i-1]+a[i],a[i]}。
而数组a[0~n]则为max{b[i]}。
在实现时,可以省略数组b[i]。实现如下: