最大连续子向量和的计算

最大连续子向量的和的问题

int a[N]; array中最大连续的subarray和是多少?

定义: maxVal  以a[i]为结尾的连续subarray的最大和。

初始值的设定:maxVal = a[0];

更新规则:

  for each a[i]

temp =  maxVal + a[i];

maxVal = max(a[i], temp);



#include<iostream>
#include<fstream>

using namespace std;

#define N  500

#define DEBUG

int maxsubseq(int a[], int n)
{
	int max = 0;
	int maxsubi = 0;
	for (int i = 0; i < n; i++)
	{
		int tmp = maxsubi + a[i];
		maxsubi = tmp > 0 ? tmp : 0;
		if (maxsubi > max)
		{
			max = maxsubi;
		}
	}

	return max;
}

int main()
{
#ifdef DEBUG
	fstream cin("G:\\book\\algorithms\\acm\\Debug\\dat.txt");
#endif

	int a[N];
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	printf("%d\n", maxsubseq(a, n));
	return 0;
}

下面这个程序和上面是一样的,不同在于是将子向量的组成打印出来了。

#include<iostream>
#include<fstream>

using namespace std;

#define N  500

#define DEBUG
#define PRINT

int maxsubseq(int a[], int n)
{
	int max = 0;
	int maxsubi = 0;
	int i;

#ifdef PRINT
int submax[N];
int e = 0, b = 0;
#endif

	for (i = 0; i < n; i++)
	{
		int tmp = maxsubi + a[i];
		maxsubi = tmp > 0 ? tmp : 0;

#ifdef PRINT
submax[i] = maxsubi;
#endif

		if (maxsubi > max)
		{   
			e = i;
			max = maxsubi;
		}
	}
#ifdef PRINT
	for(i = e; i >= 0; i--)
	{
		if (submax[i] == 0)
		{	b = i + 1; break;	}
	}
	printf("%d	%d\n", b, e);
	for (i = b; i <= e; i++)
		printf("%d ", a[i]);
	printf("\n");

#endif

	return max;
}

int main()
{
#ifdef DEBUG
	fstream cin("G:\\book\\algorithms\\acm\\Debug\\dat.txt");
#endif

	int a[N];
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	printf("%d\n", maxsubseq(a, n));
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值