O(N)的做法
#include<bits/stdc++.h>
#define MaxSize 111111
using namespace std;
int a[MaxSize];
void input(int K, int ar[])
{
for(int i = 0; i < K; i++)
{
scanf("%d", ar+i);
}
}
int main()
{
int K;
int Max = 0; //最大的和
int nowsum = 0;
scanf("%d", &K);
input(K, a);
for(int i = 0; i < K; i++)
{
nowsum +=a[i];
if(Max < nowsum)Max = nowsum;
else if(nowsum < 0)
{
nowsum = 0;// 如果加上该数为负数 前面那一段都不要 因为要了就相当于加一个负数
}
}
printf("%d", Max);
return 0;
}
O(N^2)的做法
#include<bits/stdc++.h>
using namespace std;
#define Size 111111
long a[Size];
int main(void)
{
long K;
scanf("%ld", &K);
bool neg = 0;
for(long i = 0; i < K; i++)
{
scanf("%ld", a+i);
if(a[i] < 0)neg++;
}
if(neg == K)
{
printf("0");
}
else
{
long Max = 0;
/*l为左边界 r为右边界*/
for(long l = 0; l < K; l++)// 循环左边界
{
long sum = 0;// sum 从 以l为左边界的 加到 所有的r 边界
for(long r = l;r < K;r++)// 循环右边界
{
sum+= a[r];
if(sum > Max)Max = sum;
}
}
printf("%ld", Max);
}
return 0;
}