蓝桥杯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;
}
posted @ 2022-09-11 13:27  D_coding_blog  阅读(78)  评论(0编辑  收藏  举报