最大子数组和的线性时间算法
线性算法通过迭代求解:
先做以下规定:
- 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]=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+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();
}