一、介绍:
二、代码实现
#include<iostream>
using namespace std;
int MaxSequenceSum1(int N,int arr[])
{
int MaxSum,ThisSum;
MaxSum=0;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
ThisSum=0;
for(int k=i;k<=j;k++)
{
ThisSum += arr[k];
}
if(ThisSum>MaxSum)
{
MaxSum=ThisSum;
}
}
}
return MaxSum;
}
int MaxSequenceSum2(int N,int arr[])
{
int MaxSum,ThisSum;
MaxSum=0;
for(int i=0;i<N;i++)//i是子列左端位置
{
ThisSum=0;
for(int j=i;j<N;j++)//j子列有段位置
{
ThisSum += arr[j];//对于同一起点的子列,只要在之前求和的基础上加一项即可
if(ThisSum>MaxSum)
{
MaxSum=ThisSum;
}
}
}
return MaxSum;
}
int MaxSequenceSum3(int N,int arr[])
{
int MaxSum,ThisSum;
MaxSum=0;
ThisSum=0;
for(int i=0;i<N;i++)//向右累加
{
ThisSum += arr[i];
if(ThisSum>0) MaxSum=ThisSum;//发现更大的和则更新最大值
else ThisSum=0;//如果当前和<0,则不可能使后面部分的和增大,MaxSum抛弃归0
}
return MaxSum;
}
int main()
{
int arr[9] = {0,-1,3,-4,7,5,-10,9,10};
cout << MaxSequenceSum1(9,arr)<<endl;
cout << MaxSequenceSum2(9,arr)<<endl;
cout << MaxSequenceSum3(9,arr)<<endl;
}
结果:
均为21正确结果
以上3个算法都可以,但时间复杂度不同,分别是O(N^3)
O(N^2),O(N),最后一种是在线式学习,思想方法比较重要,还有一种分而治之的思想方法。
附法三的图: