【算法导论】4.1-5

最大子数组和的线性时间算法

线性算法通过迭代求解:
先做以下规定:

  • 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
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();
}

你可能感兴趣的:(读书笔记)