一、暴力求解
时间复杂度为n^2
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
#define inf 0x3f3f3f3f
int main()
{
int a[10002],maxx,sum,n;
scanf("%d",&n);
for(int i=0;i<n;++i)
scanf("%d",&a[i]);
maxx = -inf
for(int i=0;i<n;++i)
{
sum = 0;
for(int j=i;j<n;++j)
{
sum += a[j];
maxx=max(sum,maxx)
}
}
printf("%d\n",maxx);
}
优化
时间复杂度n
该方法优化的基于的思想就是,最大连续子序列的开始一段的序列肯定不会是负数。
比如i……j……n是最大连续子序列的话,那么i+….+j肯定大于0,否则,我们就可以把这一段序列去掉换来更大的和。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
#define inf 0x3f3f3f3f
int main()
{
int a[10002],maxx,n,sum;
scanf("%d",&n);
for(int i=0;i<n;++i)
scanf("%d",&a[i]);
sum = 0;
maxx = -inf;
for(int i=0;i<n;++i)
{
if(sum<=0)//如果前面的和为负,则前面的序列舍掉从本元素开始重新确定新序列
sum = a[i];
else//如果前面的和为正,则可能出现在最大序列中,所以要继续累加
sum += a[i];
maxx=max(maxx,sum)
}
printf("%d\n",maxx);
return 0;
}