Max Sequence
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 15836 | Accepted: 6644 |
Description
Give you N integers a1, a2 ... aN (|ai| <=1000, 1 <= i <= N).
You should output S.
You should output S.
Input
The input will consist of several test cases. For each test case, one integer N (2 <= N <= 100000) is given in the first line. Second line contains N integers. The input is terminated by a single line with N = 0.
Output
For each test of the input, print a line containing S.
Sample Input
5
-5 9 -5 11 20
0
Sample Output
40
Source
POJ Monthly--2005.08.28,Li Haoyuan
题目链接 :2593 :http://poj.org/problem?id=2593
2479 :http://poj.org/problem?id=2479
题目大意:两题意思一样,给一个数字组成的序列,求两段不相交的子序列,使它们的和最大,求出这个最大值。
题目分析:可以考虑分别从左往右和从右往左dp出最大子段和,再分别从两头枚举得出答案,特判n=2的情况
2593:
2479:
题目链接 :2593 :http://poj.org/problem?id=2593
2479 :http://poj.org/problem?id=2479
题目大意:两题意思一样,给一个数字组成的序列,求两段不相交的子序列,使它们的和最大,求出这个最大值。
题目分析:可以考虑分别从左往右和从右往左dp出最大子段和,再分别从两头枚举得出答案,特判n=2的情况
2593:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const MAX = 100000 + 5;
int r[MAX], l[MAX], num[MAX];
int main()
{
int n, ans;
while(scanf("%d", &n) != EOF && n)
{
ans = 0;
memset(r, 0, sizeof(r));
memset(l, 0, sizeof(l));
memset(num, 0, sizeof(num));
for(int i = 1; i <= n; i++)
scanf("%d", &num[i]);
if(n == 2)
{
printf("%d\n", num[1] + num[2]);
continue;
}
for(int i = 1; i <= n; i++)
{
if(l[i - 1] > 0)
l[i] = l[i - 1] + num[i];
else
l[i] = num[i];
}
for(int i = 1; i < n; i++)
if(l[i] > l[i + 1])
l[i + 1] = l[i];
for(int i = n; i > 0; i--)
{
if(r[i + 1] > 0)
r[i] = r[i + 1] + num[i];
else
r[i] = num[i];
}
for(int i = n; i > 0; i--)
if(r[i] < r[i + 1])
r[i] = r[i + 1];
for(int i = 1; i <= n; i++)
ans = max(ans, l[i] + r[i + 1]);
printf("%d\n", ans);
}
}
2479:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const MAX = 100000 + 5;
int r[MAX], l[MAX], num[MAX];
int main()
{
int t, n, ans;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
ans = 0;
memset(r, 0, sizeof(r));
memset(l, 0, sizeof(l));
memset(num, 0, sizeof(num));
for(int i = 1; i <= n; i++)
scanf("%d", &num[i]);
if(n == 2)
{
printf("%d\n", num[1] + num[2]);
continue;
}
for(int i = 1; i <= n; i++)
{
if(l[i - 1] > 0)
l[i] = l[i - 1] + num[i];
else
l[i] = num[i];
}
for(int i = 1; i < n; i++)
if(l[i] > l[i + 1])
l[i + 1] = l[i];
for(int i = n; i > 0; i--)
{
if(r[i + 1] > 0)
r[i] = r[i + 1] + num[i];
else
r[i] = num[i];
}
for(int i = n; i > 0; i--)
if(r[i] < r[i + 1])
r[i] = r[i + 1];
for(int i = 1; i <= n; i++)
ans = max(ans, l[i] + r[i + 1]);
printf("%d\n", ans);
}
}
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const MAX = 50005;
int const INF = -2147483640;
int a[MAX], dp[2][MAX];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
memset(dp, 0, sizeof(dp));
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
int cur = 0, ma = INF;
for(int i = 0; i < n; i++)
{
cur += a[i];
ma = max(cur, ma);
if(cur < 0)
cur = 0;
dp[0][i] = ma;
}
cur = 0, ma = INF;
for(int i = n - 1; i >= 0; i--)
{
cur += a[i];
ma = max(cur, ma);
if(cur < 0)
cur = 0;
dp[1][i] = ma;
}
int ans = INF;
for(int i = 0; i < n - 1; i++)
ans = max(ans, dp[0][i] + dp[1][i + 1]);
printf("%d\n", ans);
}
}