#include<stdio.h>
#include<stdlib.h>
void MaxSubseqSum(int A[],int N);
int main()
{
int N;
scanf("%d",&N);
int *A=(int *)malloc(sizeof(int));
int i;
for(i=0;i<N;i++)
{
scanf("%d",&A[i]);
}
MaxSubseqSum(A,N);
free(A);
return 0;
}
void MaxSubseqSum(int A[],int N)
{
int first,end;
int i,j,MaxSum=-1,ThisSum;//MaxSum=-1是为了解决最大值为0 列:-5 -1 -2 0 此时first==end==0
for(i=0;i<N;i++)//这层循环是依次从第一个数开始做加法
{
ThisSum=0;//一趟循环之后 ThisSum=0
for(j=i;j<N;j++)
{
ThisSum+=A[j];//error:ThisSum+=A[i],从i开始加上每一个数;
if(ThisSum>MaxSum) //ThisSum!=MaxSum 保证了如果有多个MaxSum选下标最小的那个
{
MaxSum=ThisSum;
first=A[i]; //first等于从哪个数开始做加法也就是第一层循环中i的值 可以记录每一个子列的first
end=A[j]; //
}
}
}
if(MaxSum<0)printf("0 %d %d",A[0],A[N-1]);
else printf("%d %d %d",MaxSum,first,end);
}
/*这里面有个结论:假如 10
-10 1 2 3 4 -5 -23 3 7 -21
从-10加到-21
从1加到-21
......
一定可以找到最大子列和 */
(浙江大学数据结构C语言详解不懂可问)7-1 Maximum Subsequence Sum (25 分)
最新推荐文章于 2021-10-23 13:44:56 发布