计算一个数组内n个连续子串的和的最大值

计算一个数组内n个连续子串的和的最大值

  • 问题描述
  • Input
  • Output
  • 示例
  • 解答1
  • 解答2
  • 备注

问题描述

众所周知,strawberry的妹子很多而且总数甚至是不可数的,妹子集合和阿里夫零等势。今天strawberry把他的n个妹子带来,排成一排。strawberry的妹子很多,但是质量不容乐观。每个妹子有美丽度,有正有负。strawberry想选出其中3队妹子,使得她们的美丽度之和最大。每一队都应该是一个连续的区间。而且两队不能选择同一个妹子。strawberry又去找新的妹子了。请你帮帮strawberry算算最大美丽度是多少?

Input

输入一行一个数n,表示strawberry这次带来的妹子数。接下来一行n个数,分别表示每个妹子的美丽度。

Output

输出一个数,表示最大美丽度。

示例

10
-1 2 3 -4 0 1 -6 -1 1 -2
7

解答1

答案比较简单,用空间换时间,效率还行。
#include 
#include 
#include 
#include 

using namespace std;

//定义分组数目
#define GROUP_COUNT 3

int main()
{
	int nCount;
	vector vec;
	cin >> nCount;
	for (int i = 0; i < nCount; i++)
	{
		int a;
		cin >> a;
		vec.push_back(a);
	}

	vector resultVec;
	vector nagativeVec;
	int nSum = 0;
	for (int i = 0; i < nCount; i++)
	{
		if (vec[i] <= 0)
		{ 
			if (nSum != 0)
			{
				resultVec.push_back(nSum);
				nSum = 0;
			}
			nagativeVec.push_back(vec[i]);
		}
		else
		{
			if (i + 1 == nCount)
			{
				if (nSum > 0)
				{
					resultVec.push_back(nSum);
				}
			}
			else
			{
				nSum += vec[i];
			}
		}
	}

	sort(resultVec.begin(), resultVec.end());
	sort(nagativeVec.begin(), nagativeVec.end());

	int nResult = 0;
	int nDel = GROUP_COUNT - resultVec.size();
	if (nDel <= 0)
	{
		//足够3个
		int nSize = resultVec.size();
		for(int n = 1; n <= GROUP_COUNT; n++)
		{
			nResult += resultVec[nSize - n];
		}
	}
	else
	{
		//先求和
		nResult = accumulate(resultVec.begin(), resultVec.end(), 0);
		for (int j = nagativeVec.size() - 1; j >= 0 && nDel >= 0; j++, nDel--)
		{
			nResult += nagativeVec[j];
		}
	}

	cout << nResult;

	getchar();
	getchar();

	return 0;
}

解答2

#include 
#include 

using namespace std;

#define GROUP_COUNT 3

int maxSubArray(vector A)
{
	int sum = 0;
	int maxsum = INT_MIN;
	for (int i = 0; i < A.size(); i++)
	{
		sum += A[i];
		if (sum > maxsum) maxsum = sum;
		if (sum < 0) sum = 0;
	}
	return maxsum;
}

int main55555555()
{
	int nCount;
	vector vec;
	cin >> nCount;
	for (int i = 0; i < nCount; i++)
	{
		int nValue;
		cin >> nValue;
		vec.push_back(nValue);
	}

	//分为三等分
	int a = nCount / GROUP_COUNT;
	int b = nCount - a * 2;
	vector vec1, vec2, vec3;

	//首部
	int i = 0;
	for (; i < a; i++)
	{
		vec1.push_back(vec[i]);
	}
	for (; i < a + b; i++)
	{
		vec2.push_back(vec[i]);
	}
	for (; i < a + b + a; i++)
	{
		vec3.push_back(vec[i]);
	}


	int nSum = maxSubArray(vec1) + maxSubArray(vec2) + maxSubArray(vec3);

	return 0;
}

备注

这两个解答都是最优解法,如果有想出来的朋友请留言。此问题是Google面试题的改进版。

你可能感兴趣的:(算法)