文章

20

粉丝

223

获赞

52

访问

125.8k

头像
利用动态规划先得出最大子段和及该子序列最后一个元素的索引,然后从最后一个元素的索引位置开始往前将最大子段和减去当前的序列元素,直到减为0,则得到该子序列第一个元素的索引
推荐阅读
P1334 浙江大学/中国矿业大学机试题
发布于2022年7月8日 16:46
阅读数 5.1k

#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]);
	}
}

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发