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

算法题(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.dtcms.com/a/190560.html

相关文章:

  • Pass-the-Hash攻击原理与防御实战指南
  • Python × CARLA:如何在自动驾驶仿真世界里打造智能驾驶系统?
  • ElasticSearch深入解析(十二):聚合——分桶聚合、指标聚合、管道子聚合
  • 歌词滚动效果
  • Docker镜像操作全攻略:从查看、拉取到删除
  • Stable Diffusion WebUI 插件大全:功能详解与下载地址
  • 命令行快速上传文件到SFTP服务器(附参考示例)
  • 配置Spark环境
  • 从规则驱动到深度学习:自然语言生成的进化之路
  • 人机环境体系的自主决策与机器系统的自主决策不同
  • 3337. 字符串转换后的长度 II
  • 微服务商城(1)开篇、服务划分
  • LLM(大语言模型)部署加速方法——PagedAttention
  • 【第六课】ESP32-S3 BLE 与 WiFi 一体化通信示例
  • 从0开始学linux韦东山教程第三章问题小结(4)
  • 内存分配器ptmalloc2、tcmalloc、jemalloc,结构设计、内存分配过程详解
  • fiftyone-数据库配置和config与app_config配置文件
  • 耐压击穿测试的原理、流程及应用领域
  • SymPy | 如何提取指定项的系数
  • LeetCode 820 单词的压缩编码题解
  • 笔记本电脑打开网页很慢,一查ip地址网段不对怎么处理
  • 数学建模初等模型应用
  • 影刀RPA网页自动化总结
  • TCP 三次握手建立连接详解
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-B. 错误代码与解决方案
  • AWS技术助力企业满足GDPR合规要求
  • MATLAB 中常用的微分函数介绍
  • 武汉科技大学人工智能与演化计算实验室许志伟课题组参加2025中国膜计算论坛
  • 网络运维过程中的常用命令
  • 安装npm:npm未随Node.js一起安装