一、三重循环
二、一的改进版:二重循环
三、分治法
//分治法
#include<stdio.h>
#include<stdlib.h>
#define LISTSIZE 50000
typedef struct
{
int *elem;
int length;
}Sqlist;
int Createlist(Sqlist *L,int n)
{
L->elem=(int *)malloc(LISTSIZE*sizeof(int));
if(!L->elem) return -1;
int i;
for(i=0;i<n;i++)
scanf("%d",&L->elem[i]);
L->length=n;
return 0;
}
int Maxsum(int a[],int left,int right)
{
int sum;
if(left==right)
return a[left];
else
{
int mid=(left+right)/2;
int leftsum=Maxsum(a,left,mid); //左半边序列最大和
int rightsum=Maxsum(a,mid+1,right); //右半边序列最大和
int i;
int lefts=a[mid],sum1=a[mid]; //左半边的最右边
for(i=mid-1;i>=left;i--)
{
lefts+=a[i];
if(lefts>sum1)
sum1=lefts;
}
int rights=a[mid+1],sum2=a[mid+1]; //右半边的最左边
for(i=mid+2;i<=right;i++)
{
rights+=a[i];
if(rights>sum2)
sum2=rights;
}
sum=leftsum>rightsum?leftsum:rightsum;
sum=sum>(sum1+sum2)?sum:(sum1+sum2); //最后sum1与sum2相加得到横跨左右序列的最大和,分别与左右半边序列最大和比较
}
return sum;
}
void main()
{
Sqlist L;
int n;
scanf("%d",&n);
Createlist(&L,n);
printf("%d",Maxsum(L.elem,0,n-1));
}
四、在线处理
//在线处理
int maxSum(int *a,int n){
int i,j,k,sum=0,maxSum=0;
for(i=0;i<n;i++){
sum += a[i];
if(sum > maxSum) maxSum = sum;
else if(sum < 0) sum=0;
}
return maxSum;
}