问题:给定一整数序列a1,a2,a3,...an(可能有负数),求a1~an的一个子序列ai~aj,使得ai~aj的和最大
例如:a[]={4,-3,5,2,-1,2,6,2},考虑算法的复杂度,给出三种不同复杂度,以c语言实现
1.算法复杂度为o(n2),是穷举法的一个改进算法
<span style="font-size:18px;">elemtype function1(elemtype a[])
{
int i,j;
elemtype sum,maxm=0;
for(i = 0;i < N;i++)
{
sum = 0; /*sum是a[i]到a[j]的连续和*/
for(j = i;j < N;j++)
{
sum += a[j];
if(sum > maxm)
maxm = sum;
}
}
return maxm;
} </span>
2.算法复杂度为o(nlogn),利用的是递归,分而治之的方法
<span style="font-size:18px;">elemtype function2(elemtype a[],int left,int right)
{
int centre = (left+right)/2;
if(left == right) /*最底层递归调用*/
{
return a[left];
}
elemtype maxleft=function2(a,left,centre); /*左半边最大值*/
elemtype maxright=function2(a,centre+1,right); /*右半边最大值*/
int leftBorderSum=0,maxleftBorderSum=0;
for(int i = centre;i >= left;i--) /*跨边界从中间开始向左边界求最大和*/
{
leftBorderSum += a[i];
if(leftBorderSum > maxleftBorderSum)
maxleftBorderSum = leftBorderSum;
}
int rightBorderSum = 0,maxrightBorderSum = 0;
for(int i = centre+1;i <= right;i++) /*跨边界从中间开始向右边界求最大和*/
{
rightBorderSum += a[i];
if(rightBorderSum > maxrightBorderSum)
maxrightBorderSum=rightBorderSum;
}
return max(maxleft,maxright,maxleftBorderSum+maxrightBorderSum);
}</span>
3.算法的复杂度为o(n),运用动态规划思想
elemtype function3(elemtype a[],int n)
{
elemtype sum=0,max=0;
for(int i = 0;i < n;i++)
{
sum += a[i];
if(sum > max)
max = sum;
else if(sum < 0)
sum = 0;
}
return max;
}