/*
注意点:
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;
}
PTA 1007 Maximum Subsequence Sum
猜你喜欢
转载自blog.csdn.net/HDZ1821/article/details/86738537
今日推荐
周排行