蓝桥杯备考:动态规划dp之最大子段和

和之前的顺序一下

step1:

我们先确定状态表示 f[i]表示以i为终点的最大子段和

step2:确定状态表示方程

f[i]=f[i-1]+a[i],仅仅是这样吗?no absolutely not

我们假如以i-1为终点的最大字段和是负无穷,而a[i]是一个正数,那么 f[i-1]+a[i]肯定是比a[i]本身要小的,

所以我们真实的状态方程应该是f[i]=max(a[i],a[i]+f[i-1])

step3;初始化

我们数组下标从1开始,那么初始化f[1] 的时候 f[1]应该等于a[i] f[i-1]的值不应该影响最终结果

所以刚开始我们数组要初始化成0

为什么从下标1开始,这是为了防止越界

cpp 复制代码
#include <iostream>
using namespace std;
const int N = 2e5+10;
typedef long long LL;
LL f[N];
LL a[N];
LL n;
int main()
{
	cin >> n;
	for(LL i = 1;i<=n;i++)
	{
		cin >> a[i];
	}
	LL ret = -1e9;
	for(LL i = 1;i<=n;i++)
	{
		f[i] = max(f[i-1]+a[i],a[i]);
		ret = max(f[i],ret);
	}
	cout << ret << endl;
	
	
	
	
	
	return 0;
}

当然我们是可以对空间做一些优化的,比如说,我们不必开一个a[N]数组,我们有一个f[N]数组就足够了,我们用一个临时变量输入n次代表每个数就行了

cpp 复制代码
#include <iostream>
using namespace std;
const int N = 2e5+10;
typedef long long LL;
LL f[N];
LL a[N];
LL n;
int main()
{
	LL ret = -1e9;
	cin >> n;
	LL x;
	for(LL i = 1;i<=n;i++)
	{
		cin >> x;
		f[i] = max(f[i-1]+x,x);
		ret = max(f[i],ret); 
	}
	cout << ret << endl;
	
	
	
	
	
	return 0;
}
相关推荐
向往着的青绿色19 小时前
完全平方数【Letcode279题解】
开发语言·c++·数学·算法·面试·性能优化·动态规划
酉鬼女又兒20 小时前
零基础入门前端JavaScript 基础语法详解(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·chrome·蓝桥杯
QD_ANJING20 小时前
2026年大厂前端高频面试原题-React框架200题
开发语言·前端·javascript·react.js·面试·职场和发展·前端框架
xiaoye-duck20 小时前
《算法题讲解指南:动态规划算法--路径问题》--7.礼物的最大价值,8.下降路径最小和
c++·算法·动态规划
念越20 小时前
第十七届蓝桥杯软件测试模拟赛1期题目及解析
蓝桥杯·测试用例·测试
Fairy要carry21 小时前
面试09-Agent 的团队协作
面试·职场和发展
wengqidaifeng21 小时前
备战蓝桥杯----C/C++组 (一)数据结构与STL讲解(中):树、二叉树与堆——从层次结构到优先队列的进阶之路
c语言·c++·蓝桥杯
前端摸鱼匠21 小时前
面试题7:Encoder-only、Decoder-only、Encoder-Decoder三种架构的差异与适用场景?
人工智能·深度学习·ai·面试·职场和发展·架构·transformer
小年糕是糕手21 小时前
【35天从0开始备战蓝桥杯 -- Day5】
数据结构·数据库·c++·算法·蓝桥杯