POJ 2479 解题报告
2014-12-14 11:06
369 查看
这道题是对求一个数组中最大连续子数组和的改编,求两段最大子数组和的和。Leetcode上面好多类似的。看了discuss才回想起来。代码重复的地方很多。其实就是最大子数组和的代码,左右各求一遍。这样对任意位置,都知道左边和右边的最大和是多少,加起来就可以。
2479 | Accepted | 720K | 438MS | C++ | 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; }
相关文章推荐
- poj 2479解题报告
- POJ 2479 Maximum sum 解题报告
- POJ 2479 Maximum sum 动态规划 解题报告
- POJ - 2479 Maximum sum解题报告
- poj 2593 & poj 2479解题报告
- 【原】 POJ 2479 Maximum sum 动态规划 解题报告
- poj1068解题报告(模拟类)
- [解题报告]POJ-2698-八皇后问题
- POJ-2251___走迷宫——解题报告 BFS
- poj 2396 Budget 解题报告
- poj图论解题报告索引
- POJ 3264 解题报告 RMQ 问题 ST算法
- poj解题报告——2948
- POJ 1141 解题报告
- openoj的一个小比赛(J题解题报告)poj1703(并查集)
- POJ 1002 487-3279 解题报告
- POJ 3020(最小路径覆盖)解题报告
- POJ 1663 解题报告
- POJ 1012 Joseph解题报告
- POJ 1226 Substrings 解题报告