我们先解决最大连续子段和。
问题描述:给定一个数组(元素可负,输出数组的任何连续子数组中的最大值。
此题有很多种解法。
第一种:循环嵌套,找出所有组合,记录最大值。时间复杂度O(n^2)。
int MaxSum(int *v,int n,int *besti,int *bestj)
{
int sum=0;
int i,j;
for (i=1;i<=n;i++)
{
int thissum=0;
for (j=i;j<=n;j++)
{
thissum+=v[j];
if (thissum>sum)
{
sum=thissum;
*besti=i;
*bestj=j;
}
}
}
return sum;
}
第二种方法是递归。
初始问题是要处理大小为n的数组,所以可以将其划分为两个子数组a和b,然后递归的找出a、b中元素总和最大的子数组分别为MaxA、MaxB。而最大子数组要么在a中,要么在b中,要么跨越a和b之间的边界,我们将跨越边界的最大子数组记为MaxC。我们通过分治算法计算处了MaxA和MaxB,通过某种办法计算处MaxC。然后返回三个中的最大值就是我们所要的最大子数组和。
int MaxSum_DIV(int *v,int l,int r)
{