您的位置:首页 > 其它

POJ 2479 解题报告

2014-12-14 11:06 369 查看
这道题是对求一个数组中最大连续子数组和的改编,求两段最大子数组和的和。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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: