题目描述:给出一个长度为n 的序列 a,选出其中连续且非空的一段使得这段和最大。
输入格式:第一行是一个整数,表示序列的长度n。第二行有n个整数,第i行表示序列的第i个数字为ai。
输出格式:输出一行表示答案。
算法思路:动态规划。用 f[j] 表示以j这个数组下标结尾的区间的集合,属性为求最大值。状态计算为在f[j-1]+a[j]和a[j]中取最大值。最后的答案是在所有的f[j]中取最大值。
细节注意:数列中有负数,将maxx初始化时不能仅仅初始化为负数,要初始化为负无穷。
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
long long a[200005];
long long f[200005];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)cin >> a[i];
long long maxx = -0x3f3f3f3f;
for (int j = 1; j <= n; j++)
{
f[j] = max(f[j - 1]+a[j], a[j]);
maxx = max(maxx, f[j]);
}
cout <<maxx;
return 0;
}