最大子数组和的线性时间算法
线性算法通过迭代求解:
先做以下规定:
- A [ i . . . j ] A[i...j] A[i...j]表示 a [ i . . . j ] a[i...j] a[i...j]的最大子数组和。
- P [ j ] P[j] P[j]表示 a [ 1... j ] a[1...j] a[1...j]中包括 a [ j ] a[j] a[j]的最大子数组和
则:
A
[
1...
j
+
1
]
=
m
a
x
(
A
[
1...
j
]
,
a
[
j
+
1
]
,
P
[
j
]
+
a
[
j
+
1
]
)
A[1...j+1]=max(A[1...j] , a[j+1],P[j]+a[j+1])
A[1...j+1]=max(A[1...j],a[j+1],P[j]+a[j+1])
如此,在每次迭代更新记录
A
[
1...
j
]
和
P
[
j
]
A[1...j]和P[j]
A[1...j]和P[j],则一遍迭代完成后即可得出
A
[
1...
n
]
A[1...n]
A[1...n]。
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void main()
{
int n, i, j, a[3200], pre, max;
scanf("%d",&n);
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
max = pre = a[1];
for (i = 2; i <= n; i++)
{
if (a[i] > max)
max = a[i];
if (pre + a[i] > max)
max = pre + a[i];
if (pre >= 0)
pre = pre + a[i];
else
pre = a[i];
}
printf("%d\n", max);
getchar();
getchar();
}