代码一:
#include<stdio.h>
#include<iostream>#include<math.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<stack>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define N 1000000
__int64 a[N];
using namespace std;
int main()
{
__int64 sum,sum1,n,i;
while(scanf("%I64d",&n)!=EOF)
{
sum=sum1=0;
for(i=0;i<n;i++)
scanf("%I64d",&a[i]);
for(i=0;i<n;i++)
{
sum+=a[i];
if(sum>sum1)
sum1=sum;
else if(sum<0)
sum=0;
}
if(sum1!=0)
printf("%I64d\n",sum1);
else
{
sum1=a[0];
for(i=0;i<n-1;i++)
{
if(a[i+1]>a[i])
sum1=a[i+1];
}
printf("%I64d\n",sum1);
}
}
return 0;
}
代码二:
#include<stdio.h>
#include<string.h>
#include<string>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
__int64 f[1000010];
int maxsub(int low,int high)
{
__int64 s1,s2,s3,s4,s31,s41;
__int64 sum,mid;
__int64 a,b;
mid=(low+high)/2;
if(low==high)
return f[low];
s1=maxsub(low,mid);
s2=maxsub(mid+1,high);
s3=f[mid];
s4=f[mid+1];
s31=s3;
s41=s4;
a=mid-1;
for(;a>=0;a--)
{
s31+=f[a];
if(s31>s3)
s3=s31;
}
a=mid+2;
for(;a<high+1;a++)
{
s41+=f[a];
if(s41>s4)
s4=s41;
}
sum=s3+s4;
if(sum<s1)
sum=s1;
if(sum<s2)
sum=s2;
return sum;
}
int main()
{
int a,b;
while(scanf("%d",&a)!=EOF)
{
for(b=0;b<a;b++)
{
scanf("%I64d",&f[b]);
}
printf("%d\n",maxsub(0,a-1));
}
return 0;
}
先说说代码二。
代码二利用递归,分治。最大段在mid左边,或者mid右边,或者加在中间。s1计算左边,s2计算右边,s3,s4计算中间,sum为最大值。由于重复调用函数,时间量比较大,时间复杂度为O(n*logn)。
代码一是同学Triose写的。
首先如果子序列之和最大值大于0(也就是至少一个元素为正数),进行搜索。这一步的时间复杂度为O(n^2),由于没有调用函数,计算速度比我的快。第二步,就是搜索最大的元素就行了这一步时间复杂度为O(n)。