POJ 2479 解题报告

这道题是对求一个数组中最大连续子数组和的改编,求两段最大子数组和的和。Leetcode上面好多类似的。看了discuss才回想起来。代码重复的地方很多。其实就是最大子数组和的代码,左右各求一遍。这样对任意位置,都知道左边和右边的最大和是多少,加起来就可以。

2479Accepted720K438MSC++1635B
/* 
ID: thestor1 
LANG: C++ 
TASK: poj2479 
*/
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <limits>
#include <string>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <cassert>

using namespace std;

const int MAXN = 50000;

int main()
{
	int nums[MAXN];
	int leftsums[MAXN], rightsums[MAXN];
	int T;
	scanf("%d", &T);
	for (int t = 0; t < T; ++t)
	{
		int n;
		scanf("%d", &n);
		for (int i = 0; i < n; ++i)
		{
			scanf("%d", &nums[i]);
		}

		bool allneg = true;
		int maxneg = INT_MIN;
		int sum = 0, maxsum = INT_MIN;
		for (int i = 0; i < n; ++i)
		{
			if (allneg && nums[i] < 0)
			{
				maxneg = max(maxneg, nums[i]);
				leftsums[i] = maxneg;
			}
			else
			{
				allneg = false;
				sum += nums[i];
				if (sum < 0)
				{
					sum = 0;
				}
				maxsum = max(maxsum, sum);
				leftsums[i] = maxsum;
			}
		}

		allneg = true;
		maxneg = INT_MIN;
		sum = 0, maxsum = INT_MIN;
		for (int i = n - 1; i >= 0; --i)
		{
			if (allneg && nums[i] < 0)
			{
				maxneg = max(maxneg, nums[i]);
				rightsums[i] = maxneg;
			}
			else
			{
				allneg = false;
				sum += nums[i];
				if (sum < 0)
				{
					sum = 0;
				}
				maxsum = max(maxsum, sum);
				rightsums[i] = maxsum;
			}	
		}

		maxsum = INT_MIN;
		for (int i = 0; i < n - 1; ++i)
		{
			if (leftsums[i] + rightsums[i + 1] > maxsum)
			{
				maxsum = leftsums[i] + rightsums[i + 1];
			}
		}
		printf("%d\n", maxsum);
	}
	return 0;  
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值