主要问题就是:给定整数A1,A2.......(可能为负数)求子序列和最大值(如果所有整数为负数,则子序列和为0,因为负数之中0最大)
【1】穷举法:
例如
从-2开始,数字依次往后相加,得出在以-2开始的序类中,最大值为18.
以此类推,从11开始,数字以此往后加,得出在以11开始的序类中,最大值是20
从-4开始,数字以此往后加,得出在以-4开始的序类中,最大值是9
后面程序自己看
(上面就是详细的走个程序过程,具体代码如下)
穷举法:
int MaxSubseqSum1(int List[],int N)
{
int i,j,k;
int ThisSum,MaxSum=0;
for(i=0;i<N;i++)
{
for(
ThisSum=0;
for(k=i;k<=j;k++)
ThisSum+=List[k];
if(ThisSum>MaxSum)
MaxSum=ThisSum;
}
return MaxSum;
}
三层嵌套,其的复杂度为O(N^3)。
【2】穷举法的改进
int MaxSubseqSum1(int List[],int N)
{
int i,j,k;
int ThisSum,MaxSum=0;
for(i=0;i<N;i++)
for(i=j;j<N;j++)
{
{ ThisSum=0;
for(k=i;k<=j;k++)
ThisSum+=List[k];
if(ThisSum>MaxSum)
MaxSum=ThisSum;
}
}
return MaxSum;
}
两层嵌套,其的复杂度为O(N^2)。
【3】分而治之
思维解析:
笼统的来说是把大问题划分为小问题。
把这些数一分为二,不断的分成一半,在上图所示,最小的一半是4与-3,所以在这个范围之内,她们两个的最大值是4,同时在它们的右边5与-2的最大值为5,然后它们之间有一个划分线,以这个划分点为起点,从划分线到它的最后一个数,具体实现如下图:(需要注意每一次重新算多个数之间的最大值时需要重新计算)
【4】在线处理法
思想非常的简单:
int MaxSubseqSum4(int List[],int N)
{
int i;
int ThisSum,MaxSum;
ThisSum=MaxSum=0;
for(i=0;i<N;i++)
{
ThisSum+=List[i];
if(ThisSum>MaxSum)
MaxSum=ThisSum;
else if(ThisSum<0)
ThisSum=0;
}
return MaxSum;
}
跟着代码走一遍就很容易明白