最大子段和问题

最大子段和问题

——————以洛谷P1115为例

最大子段和,顾名思义就是在一段数组中选取元素和最大的子段(或最小)

这里总结了动态更新的写法:

int main()
{
int n, a, maxm, temp;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a);
if (i == 0) maxm = temp = a;
else {
temp = max(temp + a, a);
maxm = max(maxm, temp);
}
}
printf("%d", maxm);
return 0;
}

我们有一串 \(n\) 个元素的数据,我们在每次读入数据时就进行操作,达到节约空间的目的

最大子段和的更新策略:

显然,我们对 tempmaxm 进行赋初值操作,输入第一个元素时,我们将它作为 tempmaxm 的初值

在此之后(从第二个读入的元素开始),我们每次判断 temp + aa 的大小,因为在累积 temp 这个变量时,若加上这次输入的 a 后的 tempa 还要小,那么我们就可以之间从当前的 a 重新开始累积(累积完 a 还不如从 a 重新累积

对于可加可不加的数,一定要加

这是因为,我们的 maxm 变量存储的是过去的最大值(一直存在)

只要是 temp 的值超过了当前的 maxm ,我们就更新 maxm

注意!!!一定要对 tempmaxm 赋初值(赋上第一个元素的值或是一个极小值)保证不会出现初值遗留的问题

posted @   才瓯  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示