蓝桥杯备考:动态规划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;
}
相关推荐
求梦8201 小时前
【力扣hot100题】旋转图像(15)
算法·leetcode·职场和发展
鲨莎分不晴9 小时前
反向传播的数学本质:链式法则与动态规划的完美共舞
算法·动态规划
踩坑记录11 小时前
leetcode hot100 11.盛最多水的容器 medium 双指针
算法·leetcode·职场和发展
码农水水12 小时前
中国邮政Java面试:热点Key的探测和本地缓存方案
java·开发语言·windows·缓存·面试·职场和发展·kafka
a程序小傲12 小时前
小红书Java面试被问:TCC事务的悬挂、空回滚问题解决方案
java·开发语言·人工智能·后端·python·面试·职场和发展
Geminit12 小时前
无人机培训,蚂蚁智飞在线训练,AI赋能新培训/学习模式
职场和发展
X在敲AI代码13 小时前
LeetCode 基础刷题D2
算法·leetcode·职场和发展
CCPC不拿奖不改名14 小时前
数据处理与分析:数据可视化的面试习题
开发语言·python·信息可视化·面试·职场和发展
柒.梧.14 小时前
SSM常见核心面试问题深度解析
java·spring·面试·职场和发展·mybatis
老鼠只爱大米16 小时前
LeetCode算法题详解 42:接雨水
leetcode·动态规划·双指针·单调栈·接雨水·雨水收集