【算法导论】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<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();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值