当前位置: 首页 > ai >正文

算法题(146):最大子段和

审题:
本题需要我们找到给定数组中子段之和和最大的sum值

思路:

方法一:暴力解法

我们可以使用双层for循环,第一层循环负责遍历每一个数组元素,然后分别以他们为子段起点,第二层循环从第一层循环的索引开始接着往下遍历累加结果到sum中,且遍历的时候不断用max方法让sum与answer进行比对,如果出现sum小于0就停止当前子段和的搜索,因为

即使后面的数再大,我们前面的sum也对后面的数产生了负作用。
方法二:贪心

其实我们不需要进行两层for循环,一旦出现sum小于0,说明前面一段的所有元素都不可能是最大子段和的开头索引。

贪心策略:从开头索引开始进行遍历,一旦sum小于0就将sum置为0,接着往下遍历

贪心策略证明:

假设出现了sum小于0的那一段元素存在最大子段和的初始索引

情况1:最大子段在sum内

Sak<Sck,所以Sak-Sck < 0,即Sac<0。而ac段的总和不会小于0,因为如果他小于0(也就是此时sum就小于0了),那么就不会存在Sab段,直接在Sac段就截断了

情况2:最大子段不全在sum内

我们知道:Scb>Sab

若Sab>Scb,最大子段和的开始位置就是a

而此时由于Sac+Scb = Sab,我们得出Sac又要小于0,同理此时也是不合理的

综上:最大子段和的开始位置不会出现在sum小于0的数据段中,可以直接舍弃

解题:
 

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 2e5 + 10;
typedef long long ll;
int n;
int a[N];
ll answer = -1e7;
ll sum;
int main()
{//数据录入cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];}//遍历查找for (int i = 1; i <= n; i++){sum += a[i];answer = max(sum, answer);if (sum < 0)sum = 0;}cout << answer << endl;return 0;
}

P1115 最大子段和 - 洛谷

http://www.xdnf.cn/news/6182.html

相关文章:

  • 山东大学软件学院软件工程计算机图形学复习笔记(2025)
  • 现代计算机图形学Games101入门笔记(四)
  • MySQL中的索引下推技术(ICP)
  • 简单生成验证码(适合初学)
  • 德施曼618首战全平台销额、销量双冠军 京东天猫官榜第一
  • 最优化方法Python计算:有约束优化应用——近似线性可分问题支持向量机
  • 常见的几种网络攻击
  • SQL注入报错“Illegal mix of collations for operation ‘UNION‘”解决办法
  • 精益数据分析(59/126):移情阶段的深度博弈——如何避开客户访谈的认知陷阱
  • persist和cache方法
  • STC32G12K12实战:串口通信
  • [目标检测] YOLO系列算法讲解
  • 【智能优化算法改进系列 | 第一期】基于Tent混沌映射改进智能优化算法
  • 五款提升效率的工具
  • Femap许可硬件绑定
  • Colorama:Python终端色彩美化从入门到高级
  • React useState 的同步/异步行为及设计原理解析
  • 几句话说完提示词应该怎么写
  • docker-compose——安装mysql8
  • Windows 操作系统使用 Tcping 命令检查目标主机端口是否开放
  • Day24-元组、OS模块
  • SparkSQL操作Mysql(2)
  • phpstudy的Apache添加AddType application/x-httpd-php .php .php5配置无效的处理方式
  • “智”造升级:金众诚如何赋能重型机械企业高效项目管理?
  • 【Python】超类与父类
  • Java 异常处理之 BufferUnderflowException(BufferUnderflowException 概述、常见发生场景、避免策略)
  • 华为云Flexus+DeepSeek征文|基于华为云ModelArts Studio平台体验DeepSeek-V3大模型
  • 微信小程序之按钮短时间内被多次点击问题
  • Python解释器、REPL与脚本的区别
  • TypeScript装饰器-简洁版