问题描述:
给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。
例如:
对于6 -1 5 4 -7,最长子段和为14,是6+(-1)+5+4
最直接的方法:穷举法:对数组的每一个i到j和都求出来,求出最大值,算法很好想
int result=0;
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
int sum=0;
for(int k=i;k<=j;k++)
sum+=a[k];
result=max(result,sum);
}
}
return result;
可以看出,此方法时间复杂度为O(n^3)
然后我们试着对其进行优化,发现,代码中每次都对i到j进行求和,我们可以先将结果保存起来,当然可以这么定义,定义一二维数组sum[i][j],表示i到j的和,但是i到j的和其实也就是0到j的和再减去0到i的和,只要用一个一维数组sum[i]表示0到i的和,然后用sum[j]-sum[i-1](因为还要包括i,所以要i-1)就是i到j的和了,所以经过改进的算法如下: