求最大子段和的扫描算法中,并不能成立数组中元素全为负数的情况。
扫描算法:
sum=0;
max=0;
for i=[0,n)
sum=max(sum+a[i],0);
max=(max,sum);
但这显然不能够处理元素全为负数的情况。这里要进行单独处理,我们可以将负数的处理判断和for循环放在一起进行处理,提高效率。
/*
author:song0071000#126.com
time:20140419
function:get the max subsum(include all the element is negative)
*/
int GetMaxSubSum(int a[],int n)//这里的强制条件就是n>0
{
bool isAllNeg = true;
int maxneg = INT_MIN;
int max = a[0];
int sum = 0;
for(int i = 0 ;i < n ; i++)
{
sum = sum + a[i];
if(sum < 0)
sum = 0;
if(max < sum)
max = sum;
if(a[i]>=0&&isAllNeg)
isAllNeg = false;
else if(a[i]<0&&isAllNeg&&(maxneg<a[i]))
{
maxneg = a[i];
}
}
return isAllNeg ? maxneg : max;
}