最大子段和问题
最大子段和问题
——————以洛谷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\) 个元素的数据,我们在每次读入数据时就进行操作,达到节约空间的目的
最大子段和的更新策略:
显然,我们对 temp
和 maxm
进行赋初值操作,输入第一个元素时,我们将它作为 temp
和 maxm
的初值
在此之后(从第二个读入的元素开始),我们每次判断 temp + a
与 a
的大小,因为在累积 temp
这个变量时,若加上这次输入的 a
后的 temp
比 a
还要小,那么我们就可以之间从当前的 a
重新开始累积(累积完 a
还不如从 a
重新累积)
对于可加可不加的数,一定要加
这是因为,我们的 maxm
变量存储的是过去的最大值(一直存在)
只要是 temp
的值超过了当前的 maxm
,我们就更新 maxm
注意!!!一定要对 temp
和 maxm
赋初值(赋上第一个元素的值或是一个极小值)保证不会出现初值遗留的问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具