news 2026/10/29 5:55:23

题解:学而思编程 删除一个元素

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
题解:学而思编程 删除一个元素

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现!

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

学而思编程:删除一个元素

【题目描述】

给出一个数组a 1 , a 2 , ⋯ , a n a_1,a_2,⋯,a_na1​,a2​,⋯,an​​,删除一个元素后,求它的最大子段和。(子段是指数组中连续的一段元素)

删除的元素可以由你自由选择,但是不能不删除任何元素,输出你能得到的最大的子段和。

【输入】

第1 11行,1 11个正整数n nn。

第2 22行,n nn个整数a 1 , a 2 , ⋯ , a n a_1,a_2,⋯,a_na1​,a2​,⋯,an​​。

【输出】

输出能得到的最大的子段和。

【输入样例】

5 9 5 -6 -10 7

【输出样例】

15

【核心思想】

  1. 问题分析:给定长度为n nn的数组,需要恰好删除一个元素后,求剩余数组的最大子段和。这是一个线性DP问题,关键在于如何高效计算删除某个位置后的最大子段和。

  2. 算法选择:

    • 正向DP:f [ i ] f[i]f[i]表示以位置i ii结尾的最大子段和
      • 转移方程:f [ i ] = max ⁡ ( f [ i − 1 ] + a [ i ] , a [ i ] ) f[i] = \max(f[i-1] + a[i], a[i])f[i]=max(f[i−1]+a[i],a[i])
    • 反向DP:g [ i ] g[i]g[i]表示以位置i ii开头的最大子段和
      • 转移方程:g [ i ] = max ⁡ ( g [ i + 1 ] + a [ i ] , a [ i ] ) g[i] = \max(g[i+1] + a[i], a[i])g[i]=max(g[i+1]+a[i],a[i])
    • 枚举分割点:对于每个删除位置i ii,最优解为max ⁡ ( f [ i − 1 ] + g [ i + 1 ] , f [ i − 1 ] , g [ i + 1 ] ) \max(f[i-1] + g[i+1], f[i-1], g[i+1])max(f[i−1]+g[i+1],f[i−1],g[i+1])
  3. 关键步骤:

    • 读取输入:n nn(数组长度)、a [ 1.. n ] a[1..n]a[1..n](数组元素)
    • 初始化:f ff和g gg数组初始化为极小值
    • 正向DP(i ii从1 11到n nn):
      • f [ i ] = max ⁡ ( f [ i − 1 ] + a [ i ] , a [ i ] ) f[i] = \max(f[i-1] + a[i], a[i])f[i]=max(f[i−1]+a[i],a[i])
    • 反向DP(i ii从n nn到1 11):
      • g [ i ] = max ⁡ ( g [ i + 1 ] + a [ i ] , a [ i ] ) g[i] = \max(g[i+1] + a[i], a[i])g[i]=max(g[i+1]+a[i],a[i])
    • 枚举删除位置(i ii从1 11到n nn):
      • 计算三种情况:左段+右段、仅左段、仅右段
      • a n s = max ⁡ ( a n s , f [ i − 1 ] + g [ i + 1 ] , f [ i − 1 ] , g [ i + 1 ] ) ans = \max(ans, f[i-1] + g[i+1], f[i-1], g[i+1])ans=max(ans,f[i−1]+g[i+1],f[i−1],g[i+1])
    • 输出结果:最大子段和a n s ansans
  4. 时间/空间复杂度:

    • 时间复杂度:O ( n ) O(n)O(n),三次线性遍历
    • 空间复杂度:O ( n ) O(n)O(n),存储f ff和g gg数组
  5. 线性DP的核心思想:

    • 正向与反向预处理:通过两次DP分别预处理以每个位置结尾/开头的最大子段和
    • 分割点枚举:删除位置将数组分为左右两段,预处理后可以O ( 1 ) O(1)O(1)计算每段的最优值
    • 状态转移:最大子段和要么接在前一段后面,要么重新开始
    • 边界处理:注意i = 1 i=1i=1和i = n i=ni=n时的边界情况
    • 适用于子段和问题、分割点优化、前后缀预处理类问题

【算法标签】

#线性DP-一维

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;// 定义长整型别名,便于处理大数据#defineintlonglong// ================= 常量与全局变量 =================constintN=100005;// 数组最大长度intn;// 数组长度inta[N];// 原始数组intf[N];// f[i] 表示以 i 结尾的最大子段和intg[N];// g[i] 表示以 i 开头的最大子段和intans=-1e18;// 最终答案,初始化为极小值// ================= 主函数 =================signedmain(){// 读取数组长度cin>>n;// 读取数组元素for(inti=1;i<=n;i++)cin>>a[i];// 初始化 f 和 g 数组为极小值memset(f,-0x3f,sizeof(f));memset(g,-0x3f,sizeof(g));// ========= 正向 DP:计算以 i 结尾的最大子段和 =========f[1]=a[1];// 第一个元素单独成段for(inti=2;i<=n;i++)f[i]=max(f[i-1]+a[i],a[i]);// 要么接在前一段后面,要么重新开始// ========= 反向 DP:计算以 i 开头的最大子段和 =========g[n]=a[n];// 最后一个元素单独成段for(inti=n-1;i>=1;i--)g[i]=max(g[i+1]+a[i],a[i]);// 要么接在后一段前面,要么重新开始// ========= 枚举分割点,计算不相交的两段的最大和 =========for(inti=1;i<=n;i++){// 取三种情况的最大值:// 1. 左段以 i-1 结尾 + 右段以 i+1 开头// 2. 只有左段// 3. 只有右段ans=max({ans,f[i-1]+g[i+1],f[i-1],g[i+1]});}// 输出结果cout<<ans<<endl;return0;}

【运行结果】

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/26 21:37:52

I2C总线SDA响应时间测量与系统时序优化实战

1. 项目概述&#xff1a;从一次“超速”调试说起最近在为一个工业数据采集项目做系统集成&#xff0c;核心是让一块主控板通过I2C总线&#xff0c;在一条近10米长的电缆末端&#xff0c;稳定地轮询十几个传感器节点。最初的方案很“教科书”&#xff1a;主控用了常见的MCU内置I…

作者头像 李华
网站建设 2026/10/26 15:58:35

利用人工智能赋能科学研究

围绕自然科学、工程科学和哲学社会科学&#xff0c;探索以揭榜挂帅等形式&#xff0c;建设并推广科学智能体和智能工具&#xff0c;帮助科研人员发现、总结规律&#xff0c;解决复杂问题。建设人工智能学科交叉创新平台&#xff0c;强化人工智能牵引的多学科融合发展&#xff0…

作者头像 李华
网站建设 2026/10/26 23:20:57

Ubuntu 20.04 搭建 X2Go + XFCE 远程桌面实战指南

1. 项目概述&#xff1a;为什么在 Ubuntu 20.04 上坚持用 X2Go 搭建远程桌面&#xff0c;而不是换其他方案&#xff1f;X2Go 是少数几个在 Linux 远程桌面领域真正“懂行”的工具——它不是简单地把屏幕画面推过去&#xff0c;而是把整个会话&#xff08;session&#xff09;完…

作者头像 李华
网站建设 2026/10/26 23:21:31

Agent落地成败关键:意图清晰度(Intent Clarity)工程化实践

1. “用好 Agent 最重要的技巧不是Skills&#xff0c;是这四个字”——这句话我信了&#xff0c;是在删掉第7个冗余插件、重写第3版提示词、看着Agent把“查明天北京天气”错执行成“调取NASA近地轨道气象卫星原始数据流”之后。你点开任何一篇讲Agent的教程&#xff0c;十有八…

作者头像 李华
网站建设 2026/10/26 23:20:30

从CodeWarrior到Makefile:MPC5674F嵌入式项目自动化构建迁移实战

1. 项目概述&#xff1a;从图形化IDE到自动化构建的必经之路在嵌入式开发领域&#xff0c;尤其是针对像飞思卡尔&#xff08;现恩智浦&#xff09;MPC5674F这类高性能汽车微控制器的项目&#xff0c;构建流程的稳定性和可重复性是项目成功的基石。很多工程师&#xff0c;尤其是…

作者头像 李华