和hdu 1003思路整体一致,就是少了一些格式内容,简单dp,最大子序列和.状态转移方程式是dp[i]=max(dp[i]+a[i],dp[i])
#include <iostream>
#include <string>
#include <cstring>
#include<algorithm>
#include<cmath>
#include <vector>
#include <map>
#include <stdio.h>
using namespace std;
#define MAX 10000+5
#define INF 0x3f3f3f3f
int Max(int a, int b) {
return a > b ? a : b;
}
int main() {
int n, a[MAX], dp[MAX], begin, end;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
dp[0] = a[0];
begin = 0; end = 0;
int maxn = dp[0];
for (int i = 1; i < n; i++) {
dp[i] = Max(dp[i - 1] + a[i], a[i]);
if (maxn < dp[i]) {
end = i;
maxn = dp[i];
}
}
int ans = dp[end];
if (ans == 0) {
begin = end;
while (a[begin] != 0) {
begin += 1;
break;
}
}
else
for (int i = end; ans != 0; i--) {
ans -= a[i];
if (ans == 0) {
begin = i;
}
}
if (dp[end] < 0) {
printf("0 %d %d\n", a[0], a[n - 1]);
}
else
printf("%d %d %d\n", dp[end], a[begin], a[end]);
return 0;
}