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

算法题(169):最大子段和(分治思想)

审题:

 本题需要我们找到区间的最大子段和并输出结果

思路:

方法一:分治思想

我们可以把给定区间平均分成两部分,然后获取左段区间的最大子段和,右段区间的最大子段和,以及跨区间的最大子段和。最后比较出他们三种情况的最大子段和并返回

对于获取左右两段区间的最大子段和,我们可以直接递归调用dfs进行,对于最后一种情况则需要直接处理

处理方法:

跨区间子段一定包含mid和mid+1索引的值

对于mid:我们往左遍历查找包含mid的连续左段的最大和

对于mid+1:同理往右查找

最终我们把左段最大的值和右段最大的值加起来就是跨区间最大值

解题:
 

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 2e5 + 10;
int n;
int a[N];
int dfs(int left, int right)
{if (left == right){return a[left];}int mid = (left + right) / 2;
//查找左右段最大子段和int ret = max(dfs(left, mid), dfs(mid + 1, right));//查找跨区间最大子段和int sum = a[mid]; int lmax = a[mid];for (int i = mid-1; i >= left; i--){sum += a[i];lmax = max(lmax, sum);}sum = a[mid+1]; int rmax = a[mid+1];for (int i = mid + 2; i <= right; i++){sum += a[i];rmax = max(rmax, sum);}ret = max(ret, lmax + rmax);return ret;
}
int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];}cout << dfs(1, n) << endl;//返回区间1到n的最大子段和return 0;
}

P1115 最大子段和 - 洛谷

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

相关文章:

  • AnimateCC及CreateJS:打飞机的4版本V1、V2、V3、V4
  • UltraISO绿色便携版v9 下载与安装教程
  • 基于51单片机的校园打铃及灯控制系统
  • 芯片测试之 trim修调详解
  • 《棒垒球科普》足垒球的规则·垒球2号位
  • [直播推流] 使用 librtmp 库推流
  • KSP密钥管理系统赋能智能制造:密钥管理系统在智能制造行业中有哪些典型应用
  • 单机定时任务@Schedule的常见问题
  • 5.5.1_哈夫曼树
  • uni-app项目loading显示方案
  • neo4j社区版数据库下载安装
  • 玛哈特纵剪矫平机:金属板材精密加工的“开平裁切”核心装备
  • SEO关键词与长尾词布局实战
  • 解决国内无法加载谷歌验证码(reCAPTCHA):URL 重定向配置指南
  • github-mcp-server v0.5.0 发布详解:远程 GitHub MCP 服务器全新升级与最佳实践
  • 【专业数据库探索 05】ArangoDB多模数据库革命:一个数据库解决文档图关系三大数据模型
  • Qwen3 Embedding 测试
  • 8. TypeScript 类
  • Lambda 表达式的语法与使用:更简洁、更灵活的函数式编程!
  • Dina靶机渗透
  • 算法训练第十七天
  • CQF预备知识:Python相关库 -- 通用非均匀随机数抽样 scipy.stats
  • 关于allegro 导入网表报错:Unable to find pin name in问题的解决
  • Java大模型开发入门 (9/15):连接外部世界(中) - 向量嵌入与向量数据库
  • JS进阶 Day03
  • 【构建】Meson、Bazel、Buck现代构建系统
  • RPG28.使用GameplayCue和制作死亡效果
  • Java线程安全计数器实现方案
  • 【stm32f4】ADC实验(stm32hal库)
  • 什么是旋转开关?