题目地址:
https://www.luogu.com.cn/problem/P1115
题目描述:
给出一个长度为
n
n
n的序列
a
a
a,选出其中连续且非空的一段使得这段和最大。
输入格式:
第一行是一个整数,表示序列的长度
n
n
n。
第二行有
n
n
n个整数,第
i
i
i个整数表示序列的第
i
i
i个数字
a
i
a_i
ai。
输出格式:
输出一行一个整数表示答案。
数据范围:
对于
40
%
40\%
40%的数据,保证
n
≤
2
×
1
0
3
n≤2×10^3
n≤2×103。
对于
100
%
100\%
100%的数据,保证
1
≤
n
≤
2
×
1
0
5
1≤n≤2×10^5
1≤n≤2×105,
−
1
0
4
≤
a
i
≤
1
0
4
−10^4 ≤a_i≤10^4
−104≤ai≤104。
思路是动态规划,设 f [ i ] f[i] f[i]是以 a [ i ] a[i] a[i]结尾的最大子段和,那么 f [ i ] = max { f [ i − 1 ] + a [ i ] , a [ i ] } f[i]=\max\{f[i-1]+a[i],a[i]\} f[i]=max{f[i−1]+a[i],a[i]},求一下 max f \max f maxf即可。代码如下:
#include <iostream>
using namespace std;
int n;
int res = -0x3f3f3f3f, sum;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
sum = max(x + sum, x);
res = max(res, sum);
}
cout << res << endl;
return 0;
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。