#include <stdio.h>
/*
第一种是穷举法,实际上是计算所有的子列求出其中的最大值
*/
int MaxSum(int a[],int N)
{
int thisSum,Maxsum=0;
int i,j,k;
for(i=0;i<N;i++)
for(j=i;j<N;j++)
{
thisSum=0;
for(k=i;k<=j;k++)
thisSum+=a[k];
if(thisSum>Maxsum)
{
Maxsum=thisSum;
}
}
return Maxsum;
}
/*
实际上是可以利用中间值,k层循环是不需要的,对相同的i不同的j只要在j-1次的循环的基础上累计一项就够了
*/
int Maxmid(int a[],int N)
{
int ThisSum, MaxSum = 0;
int i, j;
for( i = 0; i < N; i++ ) {
ThisSum = 0;
for( j = i; j < N; j++ ) {
ThisSum += a[j];
if( ThisSum > MaxSum )
MaxSum = ThisSum;
}
}
return MaxSum;
}
/*在线处理
将会使当前最大变小的抛弃
*/
int MaxSubseq(int A[], int N) {
int ThisSum = 0, MaxSum = 0;
for (int i=0; i < N; i++) {
ThisSum += A[i];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
else if (ThisSum < 0)
ThisSum = 0;
}
return MaxSum;
}
int main()
{
int a[5]={1,3,4,6,-1};
int max=0;
max=MaxSum(a,5);
printf("%d",max);
return 0;
}
/*
第一种是穷举法,实际上是计算所有的子列求出其中的最大值
*/
int MaxSum(int a[],int N)
{
int thisSum,Maxsum=0;
int i,j,k;
for(i=0;i<N;i++)
for(j=i;j<N;j++)
{
thisSum=0;
for(k=i;k<=j;k++)
thisSum+=a[k];
if(thisSum>Maxsum)
{
Maxsum=thisSum;
}
}
return Maxsum;
}
/*
实际上是可以利用中间值,k层循环是不需要的,对相同的i不同的j只要在j-1次的循环的基础上累计一项就够了
*/
int Maxmid(int a[],int N)
{
int ThisSum, MaxSum = 0;
int i, j;
for( i = 0; i < N; i++ ) {
ThisSum = 0;
for( j = i; j < N; j++ ) {
ThisSum += a[j];
if( ThisSum > MaxSum )
MaxSum = ThisSum;
}
}
return MaxSum;
}
/*在线处理
将会使当前最大变小的抛弃
*/
int MaxSubseq(int A[], int N) {
int ThisSum = 0, MaxSum = 0;
for (int i=0; i < N; i++) {
ThisSum += A[i];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
else if (ThisSum < 0)
ThisSum = 0;
}
return MaxSum;
}
int main()
{
int a[5]={1,3,4,6,-1};
int max=0;
max=MaxSum(a,5);
printf("%d",max);
return 0;
}