POJ 2479 Maximum sum(两段连续和最大)
题意:
给定n个数,选出连续的2段,使得2段之和的总和最大。
思路:
1. 连续最大子段和已经是非常经典的问题了,可以用线性的算法来求出来。
2. 对于2段连续最大和,可否采取分治的策略?
对于分界点i,前i个数的最大连续和,和后面的n-i个的最大连续和相加即使要求的结果了。
后面的n-i个最大连续和要倒着推导过来。
#include <cstdio> #include <cstdlib> #include <cstring> #include <climits> const int MAXN = 50010; int an[MAXN]; int d1[MAXN], d2[MAXN]; int main() { int cases; scanf("%d", &cases); while (cases--) { int n; scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &an[i]); int tmax = INT_MIN, temp = 0; for (int i = 1; i <= n; ++i) { temp += an[i]; if (tmax < temp) tmax = temp; if (temp < 0) temp = 0; d1[i] = tmax; } tmax = INT_MIN, temp = 0; for (int i = n; i >= 1; --i) { temp += an[i]; if (tmax < temp) tmax = temp; if (temp < 0) temp = 0; d2[i] = tmax; } int ans = INT_MIN; for (int i = 1; i < n; ++i) if (ans < d1[i] + d2[i+1]) ans = d1[i] + d2[i+1]; printf("%d\n", ans); } return 0; }
-------------------------------------------------------
kedebug
Department of Computer Science and Engineering,
Shanghai Jiao Tong University
E-mail: kedebug0@gmail.com
GitHub: http://github.com/kedebug
-------------------------------------------------------