题目链接:http://poj.org/problem?id=2479
题目大意:给你一个数组, 输出两个不相交的连续子数组的最大和。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> #include <cmath> #include <set> #include <map> #include <vector> #define LL long long using namespace std; LL a[50010], l[50010], r[50010];// l[i] 以 i 结束的最大和 ; r[i] 以 i 开始的最大和。 int max(int a, int b) { return a > b ? a : b; } int main() { int t, n, i; scanf("%d", &t); while(t--) { scanf("%d", &n); for(i = 1; i <= n; i++) scanf("%lld", &a[i]); l[1] = a[1]; for(i = 2; i <= n; i++){ l[i] = max(l[i - 1] + a[i], a[i]); //cout<< l[i] << " "; } r[n] = a[n]; //cout << endl; for(i = n - 1; i > 0; i--){ r[i] = max(a[i], r[i + 1] + a[i]); //cout << r[i] << " "; } //cout << endl; for(i = 2; i <= n; i++) l[i] = max(l[i - 1], l[i]); for(i = n - 1; i > 0; i--) r[i] = max(r[i + 1], r[i]); LL sum = l[1] + r[2]; for(i = 2; i < n; i++){ //cout << l[i] + r[i + 1]<< " "; if(l[i] + r[i + 1] > sum) sum = l[i] + r[i + 1]; } printf("%lld ", sum); } return 0; }