PTA 1007 Maximum Subsequence Sum

/*
注意点:
1.输入数据若全是负数,输出0,以及整个序列的首尾的数字。
2.要注意最大子序列和!=最大连续递增子序列。
最大连续递增子序列:从i~n,一旦综合开始变小就停止循环,用数组记录i当前到后可能的最大子序列即可。
最大子序列和:特点:可能会先减小再增大值。
从头走到最后,不要停下,只记录最大值,并且同时改变start,end即可。(针对这道题而言。)
数据:
这个题的输出数据顺序,含义依次是:
最大子列和 最大子列和起始位置的那个数字 最大子列和终结位置的那个数字
10
-10 0  7 -2 -1 8 4 -100 30 2
32 30 2

10
-10 1 2 3 4 -5 -23 3 7 -21
10 1 4

10
0 0 0 0 0 0 0 0 0 0
0 0 0

10
1 2 3 4 5 -1 -2 -3 -4 -5
15 1 5

10
1 -2 3 4 -8 6 0 7 -9 10
14 6 10

//重点标记这组数据。
5
-1 -2 -3 -4 -5
0 -1 -5

5
-100 99 -300 200 -500
200 200 200

5
-100 -200 0 -300 -500
0 0 0
*/
#include"stdafx.h"
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
int a[10005], b[10005];
int main()
{
	int n, i, j, maxnow, maxyet, maxend = -1e9, start, end;
	cin >> n;
	int flag = 0;//为了判定是否全为负数。
	for (i = 0; i < n; ++i)
	{
		cin >> a[i];
		if (a[i] >= 0 && flag == 0)
			flag = 1;
	}
	if(!flag)
	{
		cout << 0 << " " << a[0] << " " << a[n - 1] << endl;
	}
	else {
		for (i = 0; i < n; ++i)
		{
			maxnow = a[i], maxyet = 0;
			for (j = i; j < n; ++j)
			{
				maxyet = maxyet + a[j];
				if (maxnow > maxyet)//这里话多余了。但也没改。
				{
					//break;//从头到尾走到最后,不要停下
				}
				else
					maxnow = maxyet;
				if (maxend < maxnow)//最终值只记录最大值,并且同时变start,end即可。
				{
					maxend = maxnow;
					start = i, end = j;
				}
			}
		}
		int sum = 0;
		for (i = start; i <= end; ++i)
			sum = sum + a[i];
		cout << sum << " " << a[start] << " " << a[end] << endl;
	}
	return 0;
}
发布了39 篇原创文章 · 获赞 16 · 访问量 3160

猜你喜欢

转载自blog.csdn.net/HDZ1821/article/details/86738537