HDU-1231(求最大序列和)

来源:互联网 发布:字符串数组赋值 编辑:程序博客网 时间:2024/05/29 04:14

都快晕死了,,,本来以为改来改去是改不正确的...

没想到居然改正确了,,真心崩溃了- -#

0(n)的算法

贴出代码:

#include <stdio.h>#include <string.h>#include <iostream>#include <string>//#define max(a, b) (a) > (b) ? a : b using namespace std;int a[11111];int s[11111];int n;int best;int start, end;int Solve(){s[0] = 0;int min = a[1];best = a[1];for (int i = 1; i <= n; i++){s[i] = s[i - 1] + a[i];}int MIN;for (int j = 2; j <= n; j++){if (best < s[j] - min){best = s[j] - min;end = j;MIN = min;}if (s[j] <= min){min = s[j];}//cout << "start = " << start << " " << "end =" << end << endl;//cout << "best = " << best << endl;}for (int i = 1; i <= n; i++){if (s[i] == MIN){start = i;}} return  best;}int main(){while (scanf("%d", &n) != EOF){start = end = 1;//memset(s, 0, sizeof(0));if (n == 0){break;}best = -1111111111; int flag = 0;for (int i = 1; i <= n; i++){scanf("%d", &a[i]);if (a[i] >= 0){flag = 1;}}if (n == 1){printf("%d %d %d\n", a[1], a[1], a[1]);continue;}if (flag == 0){printf("0 %d %d\n", a[1], a[n]);continue;}int ans = Solve();if (ans == 0){printf("0 0 0\n");}else{printf("%d %d %d\n", ans, a[start + 1], a[end]);}}//system("pause");return 0;}