原理:
陈越姥姥已经讲得很好了:传送门,我只做记录方便回顾。
四种算法:
1. 暴力,算法复杂度:O(n^3)。
2. 暴力,算法复杂度:O(n^2)。
3. 分治法(递归),算法复杂度:O(nlogn)。
4. 及时处理,算法复杂度:O(n)。
代码:
#include<stdio.h>
int a[100000];
int whoIsMax(int i, int j, int k)
{
if(i>=j && i>=k)
{
return i;
}
if(j>=i && j>=k)
{
return j;
}
if(k>=i && k>=j)
{
return k;
}
}
int fenzhi(int start, int end)
{
int ZuoMax = 0;
int YouMax = 0;
int ZhongMax = 0;
int ZuoSum = 0;
int YouSum = 0;
//出口
if(start == end)
{
if(a[start]>0)
{
return a[start];
}
else
{
return 0;
}
}
int mid = (start + end) / 2;
ZuoMax = fenzhi(start, mid);
YouMax = fenzhi(mid+1, end);
int kua_zuo_max = 0, kua_you_max = 0;
int kua_zuo_sum = 0, kua_you_sum = 0;
for(int i = mid; i>=start; i--)
{
kua_zuo_sum += a[i];
if(kua_zuo_sum > kua_zuo_max)
{
kua_zuo_max = kua_zuo_sum;
}
}
for(int i = mid+1; i<=end; i++)
{
kua_you_sum += a[i];
if(kua_you_sum > kua_you_max)
{
kua_you_max = kua_you_sum;
}
}
ZhongMax = kua_you_max + kua_zuo_max;
return whoIsMax(ZuoMax, YouMax, ZhongMax);
}
int main(void)
{
int N;
scanf("%d", &N);
// for(int i = 0; i<N; i++)
// {
// scanf("%d", &a[i]);
// }
//int ThisSum = 0;
int Max = 0;
//Algorithm 1
// for(int i = 0; i<N; i++)
// {
// for(int j = i; j<N; j++)
// {
// ThisSum = 0;
// for(int k = i; k<=j; k++)
// {
// ThisSum += a[k];
// }
// if(ThisSum > Max)
// {
// Max = ThisSum;
// }
// }
// }
//Algorithm 2
// for(int i = 0; i<N; i++)
// {
// ThisSum = 0;
// for(int j = i; j<N; j++)
// {
// ThisSum += a[j];
// if(Max < ThisSum)
// {
// Max = ThisSum;
// }
// }
// }
//Algorithm 3
//Max = fenzhi(0, N-1);
//Algorithm 4
int ThisSum = 0;
for(int i = 0; i<N; i++)
{
int temp;
scanf("%d", &temp);
ThisSum += temp;
if(ThisSum<0)
{
ThisSum = 0;
}
if(Max < ThisSum)
{
Max = ThisSum;
}
}
printf("%d", Max);
return 0;
}