子序列最大和问题,记录开始结束位置。
#include int k, m, st, ed;int a[10001], dp[10001], s[10001], e[10001];int main() { while (scanf("%d", &k), k) { for (int i = 1; i <= k; ++i) scanf("%d", &a[i]); dp[0] = 0; s[0] = 0; e[0] = 0; for (int i = 1; i <= k; ++i) { if (dp[i - 1] + a[i] > a[i]) { dp[i] = dp[i - 1] + a[i]; s[i] = s[i - 1]; } else { dp[i] = a[i]; s[i] = i; } e[i] = i; } m = -10000; st = ed = 0; for (int i = 1; i <= k; ++i) { if (dp[i] > m) { m = dp[i]; st = s[i]; ed = e[i]; } } if (m < 0) { printf("%d %d %d\n", 0, a[1], a[k]); } else { printf("%d %d %d\n", m, a[st], a[ed]); } } return 0;}