蓝桥杯ADV-1174_试题 算法提高 最大连续子段和(DP)
题目描述:
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
给出一个长为n的数列,a1,a2,……,an,求和最大的连续子序列,即找到一对(i,j),i<=j,使ai+ai+1+……+aj的和最大,输出这个和
输入格式
第一行为正整数n
第二行n个用空格分开的整数
表示a1,a2,……,an
输出格式
一个整数,表示最大连续子序列的和
样例输入
3
-1 -2 -3
样例输出
-1
数据规模和约定
1<=n<=10^5,-10^5<=ai<=10^5
算法描述:DP、最大子序列和模型
分析:
①第一个数为一个有效序列
②如果一个数加上上一个有效序列得到的结果比这个数大,那么该数也属于这个有效序列。
③如果一个数加上上一个有效序列得到的结果比这个数大,那么该数也属于这个有效序列。
时间复杂度O(n)
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int n, b[N], ans = -2e9; // b数组始终存储当前最大序列和(b[i] == max(a, b[i-1] + a)
int main()
{
cin >> n;
for(int i = 1 ; i <= n ; i ++)
{
int a;
cin >> a;
if(i < 2) b[i] = a;
else b[i] = max(a, b[i-1] + a);
ans = max(ans, b[i]);
}
cout << ans;
return 0;
}