Description
Give you N integers a1, a2 ... aN (|ai| <=1000, 1 <= i <= N).
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 9 -5 11 20
0
Sample Output
额, 算法弱菜写这些真不容易
一道很简单的动态规划,枚举出所有情况前后各部分最大子串的和,取最大值即可
#include <iostream>
#include <cstdio>
#include <climits>
int main()
{
int m, i, s, max, a[100001], pre[100001];
while (std::cin >> m, m) {
s = 0;
max = INT_MIN;
for (i = 0; i != m; ++i) {
scanf("%d", &a[i]);
s += a[i];
if (s > max) {
max = s;
}
pre[i] = max;
if (s < 0) {
s = 0;
}
}
s = 0;
max = INT_MIN;
for (i = m - 1; i != 0; --i) {
s += a[i];
if (s + pre[i - 1] > max) {
max = s + pre[i - 1];
}
if (s < 0) {
s = 0;
}
}
std::cout << max << std::endl;
}
return 0;
}