//最大子列和问题1
int main() {
int S;
scanf_s("%d", &S);
int MAX = 0, thismax = 0;
int s;
for (int i = 0;i < S;i++) {
scanf_s("%d", &s);
thismax += s;
if (thismax > MAX) {
MAX = thismax;
}
else if (thismax < 0) {//当发现这个子列和为负数时
thismax = 0; //不能使之后的部分和增大,所以去掉
}
/*
max记录最大值,而thismax是记录此时检索的子列的和
当子列为负数, 子列后的数与该子列和相加必减少
所以抛弃该子列, 让子列从该子列后的数开始
但是即使该子列为负 但之前为 正值时 的最大值也会被max记录下来
*/
}
printf("%d", MAX);
return 0;
}
//最大子列和问题2 Maximum Subsequence Sum
int main() {
int S;
scanf_s("%d", &S);
int MAX = 0, thismax = 0, I = 0, J, K;
bool T = true;
int s, a[10000];
for (int i = 0;i < S;i++) {
scanf_s("%d", &s);
a[i] = s;
if (s >= 0)
T = false;
thismax += s;
if (thismax > MAX || (thismax==MAX && MAX==0)) {
K = I;
MAX = thismax;
J = i;
}
else if (thismax < 0) {//当发现这个子列和为负数时
thismax = 0; //不能使之后的部分和增大,所以去掉
I = i+1;
}
/*
MAX记录最大值,而thismax是记录此时检索的子列的和
当子列为负数, 子列后的数与该子列和相加必减少
所以抛弃该子列, 让子列从该子列后的数开始
但是即使该子列为负 但之前为 正值时 的最大值也会被MAX记录下来
*/
}
if (!T)
printf("%d %d %d", MAX, a[K], a[J]);
else
printf("%d %d %d", MAX, a[0], a[S-1]);
return 0;
}
PTA MOOC 最大子列和问题 与 Maximum Subsequence Sum
最新推荐文章于 2021-11-25 08:59:57 发布