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
-5 9 -5 11 20
0
Sample Output
40
额, 算法弱菜写这些真不容易一道很简单的动态规划,枚举出所有情况前后各部分最大子串的和,取最大值即可
- #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;
- }
阅读(1234) | 评论(0) | 转发(0) |