蓝桥杯备考:动态规划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;
}
相关推荐
一起养小猫7 小时前
《半小时漫画计算机》读后感:从入门到构建知识体系
职场和发展·学习方法·改行学it
xinxingrs17 小时前
贪心算法、动态规划以及相关应用(python)
笔记·python·学习·算法·贪心算法·动态规划
yoke菜籽21 小时前
面试150——区间
面试·职场和发展
程序员三藏21 小时前
软件测试之压力测试详解
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·压力测试
小南家的青蛙1 天前
LeetCode面试题 04.06 后继者
算法·leetcode·职场和发展
墨染点香1 天前
LeetCode 刷题【168. Excel 表列名称】
算法·leetcode·职场和发展
Swift社区1 天前
LeetCode 431 - 将 N 叉树编码成二叉树
算法·leetcode·职场和发展
川Princess2 天前
【面试经验】百度Agent架构研发工程师一面
面试·职场和发展·架构·agent
程序员小远2 天前
如何搭建Appium环境?
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
小白程序员成长日记2 天前
2025.11.21 力扣每日一题
算法·leetcode·职场和发展