题目描述
给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。
输入格式
第一行是一个整数,表示序列的长度 n。
第二行有 n 个整数,第 i个整数表示序列的第 i个数字 ai。
输出格式
输出一行一个整数表示答案。
输入输出样例
输入 #1
7 2 -4 3 -1 2 -4 3
输出 #1
4
说明/提示
样例 1 解释
选取 [3, 5] 子段 {3, -1, 2},其和为 4。
数据规模与约定
- 对于 40\% 的数据,保证 n≤2e3。
- 对于100% 的数据,保证 1≤n≤2e5,-10^4 <=ai<=10^4。fa
-
/* 最大子段和问题的递推公式是 b[j]=max{b[j-1]+a[j], a[j]},b[j] 指的是从0开始到j的最大子段和。 */ #include <iostream> #include <cstdio> #include <vector> using namespace std; const int N = 2e5 + 5; int dp[N]; vector<int> v; int main() { int n; cin >> n; int ans = -0x3f3f3f3f; for(int i = 0; i < n; ++i){ int x; scanf("%d", &x); ans = max(ans, x); v.push_back(x); } if(ans <= 0){ //当你dp数组初始化为0时,一定得加个特判,若ans<=0,下面不用dp了,直接是ans printf("%d", ans); //如果不特判,dp初始化最小值 return 0; } dp[0] = v[0]; for(int i = 1; i < n; ++i){ dp[i] = max(dp[i], dp[i-1] + v[i]); ans = max(ans, dp[i]); } cout <<ans <<endl; return 0; }