题意详细描述:点击打开链接
题意:给出一个整数序列,选出两个不相交的连续子序列其和为sum,求sum的最大值。
思路:
- 有两的连续的子序列,l[i]表示1~i个整数中选连续的若干个且以a[i]结尾的子序列和的最大值,则l[i]=max(a[i], l[i-1]+a[i]);r[i]表示i~n个整数中选连续的若干个且以a[i]开头的子序列和的最大值,则r[i]=max(a[i], r[i+1]+a[i])。
- 这两个子序列不相交,考虑1~i个整数中能取到的连续子序列和的最大值sum_l[i],i~n个整数中能取到的连续子序列和的最大值sum_r[i],则sum_l[i]=max(sum_l[i-1],l[i]),sum_r[i]=max(sum_r[i+1], r[i])。
类似的练习题:POJ 2593点击打开链接#include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; const int size = 50000 + 5; int a[size], l[size], r[size], sum_l[size], sum_r[size]; int main() { int T, n, ans; scanf("%d", &T); while(T--){ scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &a[i]); l[0] = a[0]; for(int i = 1; i < n; i++) l[i] = max(a[i], l[i-1]+a[i]); r[n-1] = a[n-1]; for(int i = n-2; i >= 0; i--) r[i] = max(a[i], r[i+1]+a[i]); sum_l[0] = l[0]; for(int i = 1; i < n; i++) sum_l[i] = max(sum_l[i-1], l[i]); sum_r[n-1] = r[n-1]; for(int i = n-2; i >= 0; i--) sum_r[i] = max(sum_r[i+1], r[i]); ans = sum_l[0] + sum_r[1]; for(int i = 1; i < n-1; i++) ans = max(ans, sum_l[i]+sum_r[i+1]); printf("%d\n", ans); } return 0; }