1. 题目描述
给定一个数字序列A1,A2…An,求i,j(1<=i<=j<=n),使得Ai+…+Aj最大,输出这个最大和。
第一行输入一个整数n,表示数列大小
第二行输入n个整数
输入样例
6
-2 11 -4 13 -5 -2
输出样例
20
2. 我的尝试
经典动态规划问题
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, INF = 0x3f3f3f3f;
// f[i]表示以下标i元素结尾的最大连续子序列和
int f[N], a[N];
int n;
int main()
{
int res = - INF;
cin >> n;
for (int i = 1; i <= n; i ++)
scanf("%d", &a[i]);
f[1] = a[1];
// 必须要以a[i]结尾,那么有俩种情况:
// 1. 以a[i-1]结尾的最大连续子序列再接上a[i]
// 2. a[i]自己独自作为一个序列
// 两者取最大值即可
for (int i = 2; i <= n; i++)
{
f[i] = max(a[i], f[i-1] + a[i]);
}
for (int i = 1; i < n; i++)
res = max(res, f[i]);
cout << res;
return 0;
}