2016算法课期末考试3
Description
给一串整数a[1..n],求出其和最大的子序列,即找出1<=i<=j<=n(1<=n<=50000),使a[i]+a[i+1]+…+a[j]最大。
Input
多组输入,EOF结束,每组输入包含两行,第一行有一个数字n表示有n个数字,第二行有n个数字,每个数字的绝对值小于1000。
Output
对于每组输入,输出最大子序列和
思路:
求最长子序列。从头开始向尾扫一遍,设置一个变量member记录和,一旦member<0,归0。表示这个点不在最长序列中。设置变量max记录最大值,不断更新。若要求从第几个元素到第几个元素是最长序列还要记录member的最大值。
注意:数据小于等于0时取最大的一个!
代码:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n, num[50050];
while (scanf("%d", &n) != EOF)
{
long max = 0;
long member = 0;
int flag = 0;
for (int i = 1; i <= n; i++)
{
cin >> num[i];
if (num[i]>0)
flag = 1;
}
if (flag) { //全为正数
for (int i = 1; i <= n; i++)
{
member += num[i];
member = member > 0 ? member : 0;
max = max > member ? max : member;
}
}
else {
max = -1000;
for (int i = 1; i <= n; i++)
max = max > num[i] ? max : num[i];
}
cout << max<<endl;
}
return 0;
}