PTA MOOC 最大子列和问题 与 Maximum Subsequence Sum

//最大子列和问题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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值