您的位置:首页 > 其它

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

2018-09-19 21:07 549 查看

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

问题描述

众所周知,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 <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

using namespace std;

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

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

vector<int> resultVec;
vector<int> 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 <iostream>
#include <vector>

using namespace std;

#define GROUP_COUNT 3

int maxSubArray(vector<int> 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<int> 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<int> 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面试题的改进版。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐