//四种求最大和的方法中,只有第二种和第四种写了输出首尾的程序
//第三种分治法暂时没想到怎么写
#include <stdio.h>
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;
}
void MaxSum2(int a[], int n, int result[])
{
int i,j,temp;
//如果除0外全是负数(考虑这种情况)
//这种情况应该输出第一个0
//如果result初始值为0,则会出问题
result[0] = -1;
result[1] = a[0];
result[2] = a[n-1];
for (i = 0; i < n; i++)
{
temp = 0;
for (j = i; j < n; j++)
{
temp += a[j];
if (temp > result[0])
{
result[0] = temp;
result[1] = a[i];
result[2] = a[j];
}
}
}
if (result[0] == -1)
{
result[0] = 0;
}
}
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;
}
void MaxSum4(int a[], int n, int result[])
{
int i,temp,minindex;
//同样注意初始值要为-1;
result[0] = -1;
result[1] = a[0];
result[2] = a[n-1];
temp = 0;
minindex = 0;
for (i = 0; i < n; i++)
{
temp += a[i];
if (temp > result[0])
{
result[0] = temp;
result[1] = a[minindex];
result[2] = a[i];
}
else if (temp < 0)
{
//当temp小于0时,更新开始值。
minindex = i+1;
temp = 0;
}
}
//全为负数的情况,一定要考虑,此点第一次测试时出错了
if (result[0] == -1)
{
result[0] = 0;
}
return ;
}
int main()
{
//result用来存储结果,0-最大值,1-开始值,2-结束值
int n,i,result[3];
scanf("%d",&n);
int a[n];
for (i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
MaxSum4(a,n,result);
printf("%d %d %d",result[0],result[1],result[2]);
return 0;
}
Maximum Subsequence Sum
最新推荐文章于 2022-04-20 23:44:06 发布