动态规划复习-HDU1231
子序列最大和问题,记录开始结束位置。
#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;
}