文章
20
粉丝
224
获赞
56
访问
136.7k
#include<stdio.h>
int K, N, a[10005], dp[10005];
int _max(int x, int y) {
return x > y ? x : y;
}
int main() {
while (scanf("%d", &K) != EOF & K != 0) {
int flag = 0, s = 0, e = 0;
for (int i = 0; i < K; ++i) {
scanf("%d", &N);
if (N >= 0) flag = 1; // 若序列中存在非负数,则置flag为1
a[i] = N;
}
// 若序列中的元素都是负数,则定义其最大和为0,输出整个序列的首尾元素
if (!flag) {
printf("%d %d %d\n", 0, a[0], a[K-1]);
continue;
}
dp[0] = a[0];
int maxx = a[0];
// 利用动态规划求出最大子段和,并得出该子序列的最后一个元素的索引
for (int i = 1; i < K; ++i) {
dp[i] = _max(dp[i-1] + a[i], a[i]);
if (dp[i] > maxx) {
maxx = dp[i];
s = e = i;
}
}
// 得出该子序列的第一个元素的索引
int now = maxx - a[s];
while (now != 0) now -= a[--s];
printf("%d %d %d\n", maxx, a[s], a[e]);
}
}
登录后发布评论
暂无评论,来抢沙发