#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 11
typedef struct subIdx {
int begin;
int end;
} SUB_IDX;
typedef struct maxSub {
SUB_IDX subPosition;
int sum;
} MAX_SUB;
MAX_SUB * MaxSubScan(const int* array, int len)
{
SUB_IDX MaxPreIdx;
MaxPreIdx.begin = 0;
MaxPreIdx.end = 0;
SUB_IDX MaxCurIdx;
MaxCurIdx.begin = 0;
MaxCurIdx.end = 0;
int MaxPre = 0;
int MaxCur = 0;
int i;
for (i = 0 ; i < len; i++) {
if ((MaxCur + array[i]) > 0) {
MaxCur = MaxCur + array[i];
MaxCurIdx.end = i;
} else {
MaxCur = 0;
MaxCurIdx.begin = i + 1;
MaxCurIdx.end = i + 1;
}
if (MaxCur > MaxPre) {
MaxPre = MaxCur;
MaxPreIdx.begin = MaxCurIdx.begin;
MaxPreIdx.end = MaxCurIdx.end;
}
}
MAX_SUB *maxsub = (MAX_SUB *) malloc( sizeof(MAX_SUB) );
maxsub->subPosition.begin = MaxPreIdx.begin;
maxsub->subPosition.end = MaxPreIdx.end;
maxsub->sum = MaxPre;
return maxsub;
}
int main()
{
int a[MAXSIZE] = {5 ,4 ,-10 ,11 ,2 ,8 ,-5 ,4 ,2 ,-3 ,1};
MAX_SUB *maxsub_result = (MAX_SUB *) malloc( sizeof(MAX_SUB) );
maxsub_result = MaxSubScan(a,MAXSIZE);
int beginindex,endindex,i;
beginindex = maxsub_result->subPosition.begin;
endindex = maxsub_result->subPosition.end;
printf("beginindex:%d->%d\n",beginindex,a[beginindex]);
printf("endindex:%d->%d\n",endindex,a[endindex]);
printf("子串为:");
for(i=beginindex;i<endindex+1;i++)
{
printf("%4d",a[i]);
}
printf("\nsum:%d\n",maxsub_result->sum);
}