//求最大子序列和的四种复杂度方法
//在学习网易公开课的数据结构课程时,写的程序
//记录下来,鼓励自己坚持学习下去
#include <stdio.h>
//在pat测试时,部分正确,运行时间太长
//暴力求解方法
int MaxSum1(int a[], int n)
{
int i,j,k,temp,sum;
sum = 0;
for (i = 0; i < n; i++)
{
for (j = i; j < n; j++)
{
temp = 0;
for (k = i; k <=j; k++)
{
temp += a[k];
if (temp > sum)
{
sum = temp;
}
}
}
}
return sum;
}
//在方法1上的优化
int MaxSum2(int a[], int n)
{
int i,j,temp,sum;
sum = 0;
for (i = 0; i < n; i++)
{
temp = 0;
for (j = i; j < n; j++)
{
temp += a[j];
if (temp > sum)
{
sum = temp;
}
}
}
return sum;
}
//分治法
int MaxSum3(int a[], int start, int stop)
{
int index,leftresult,rightresult,crossresult,result,temp,i,lefttemp,righttemp;
leftresult = rightresult = crossresult = result = 0;
//考虑终止条件,第一次写时,没有写终止条件
if (start == stop)
{
if (result < a[start])
{
result = a[start];
}
}
if (start < stop)
{
index = (start + stop) / 2;
//左右最大和
leftresult = MaxSum3(a,start,index);
rightresult = MaxSum3(a,index+1,stop);
temp = lefttemp = righttemp = 0;
//开始求跨越边界最大和
//包含边界的左边最大和
for (i = index; i >= start; i--)
{
temp += a[i];
if (temp > lefttemp)
{
lefttemp = temp;
}
}
//包含边界的右边最大和
temp = 0;
for (i = index + 1; i <= stop; i++)
{
temp += a[i];
if (temp > righttemp)
{
righttemp = temp;
}
}
//可以写一个求三个数最大和的函数
crossresult = lefttemp + righttemp;
result = leftresult;
if (result < rightresult)
{
result = rightresult;
}
if (result < crossresult)
{
result = crossresult;
}
}
return result;
}
int MaxSum4(int a[], int n)
{
int i,temp,sum;
temp = sum = 0;
for (i = 0; i < n; i++)
{
temp += a[i];
if (temp > sum)
{
sum = temp;
}
else if (temp < 0)
{
temp = 0;
}
}
return sum;
}
//测试程序
int main()
{
int n,i,result;
scanf("%d",&n);
int a[n];
for (i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
//更改函数名,测试相应的函数
result = MaxSum3(a,0,n-1);
printf("%d",result);
return 0;
}
最大子序列和问题
最新推荐文章于 2022-07-10 22:04:24 发布