POJ 2479 最大子段和 解题心得

AI生产力五维实操法:写读听思管的低摩擦工作流 AI生产力不是模型参数竞赛,而是人机协作链的系统优化。从意图识别、信息压缩到反馈闭环,核心在于降低‘人机摩擦系数’——即用户认知成本与产出确定性之间的比值。本文聚焦职场人高频刚需场景:高效写作、深度阅读、精准会议处理、结构化决策与智能任务管理,基于真实60天工作流验证,提炼出ChatGPT-4o、Claude 3.5 Sonnet、Adobe Podcast AI、Perplexity Pro和Todoist AI五大工具的命令级用法。强调‘单点穿透力’‘上下文耐受度’‘错误可逆成本’三大选型铁律,并融入事 阅读详情

问题描述:

         给一串整数下标从1~n,找出两个子串(每个子串中的下标连续),下标分

别为s1~t1和s2~t2,其中1<=s1<=t2<s2<=t2<=n,问子串和最大为多少?

 

引:

求一串数中一个连续子串和最大值的DP解法为:

设原数组为a[]

令b[j]为以第j个元素结尾的字串和的最大值。只有两种情况:1.只有a[j]  2.a[j]

接在以a[j-1]结尾的字串后面

对于情况二的证明,可用反证法证明得,以a[j-1]结尾的子串和必为该状态的最大值

。

所以b[j]=max{a[j],b[j-1]+a[j]}   

这样便求出了以每个元素结尾的字串和最大值,由于实际最大值字串必为其中之一,

再遍历一遍取其中最大值即可。

 

思路:

有了上述求一个子串最大值的解法,再推到求两个字串最大值的方法就很自然了。只

要从a[0]开始,依次取a[0],a[1].....为划分元素,

即s1<=t1<=a[x]<s2<=t2,并分别求最大值,并再这些最大值中再找最大值

证明如下,假设实际最优划分为s1,t1,s2,t2,t1<s2,可取划分元素为t1,则该最大值

必和以t1为划分元素时两边的最大值的和相等,否则矛盾。因此最优解必为n种划分

情况中的一种的最优解。

问题现在转化为,如何找到每种划分的最大值?其实只要分找两边字串各自的最大字

串和即可(反证法)

 

解法:

1.从头到尾遍历一遍,求出leftsum[x]

2.从尾到头遍历一遍,求出rightsum[x]

3.从头到尾遍历一遍,求出最大的和

 

步骤一和二中,要用中间变量b记录中间值。以步骤1为例,要先用b记录以a[i](设

划分元素为a[i])结尾的最大字串和,再与leftsum[i-1]比较,即比较包括a[i]和不

包括a[i]的字串,找出最大值,即为a[0]~a[i]的所有字串的最大值。步骤二同理。

 

这个算法耗时O(n),是比较快的算法。我刚开始做的时候用了比较笨的方法,就是把

求一个字串最大和做成一个函数,再遍历数组同时调用这个函数来算leftsum和

rightsum。这样需耗时O(n2),因为调用一次函数的代价为O(n),结果超时了。。。

 

这题还有个小陷阱,就是这个最大和可能是负值,考虑全是负数的情况,但即便如此

算法最多只会算两个负数相加,题目中条件说元素的绝对值<=10000,因此sum的初始

值可赋-20000,保险起见可赋-60000,ok,这下可以AC了~~~

 

源代码如下:

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
 int T;
 cin>>T;
 int t,i,k;
 for(t=0;t<T;t++)  {
  int n,sum=-60000,b;  //注意sum可能小于0!!!(全是负数,但此时最多为两

个负数的和)
  cin>>n;
  int *a=new int[n];
  int *lsum=new int[n];
  int *rsum=new int[n];
  for(i=0;i<=n-1;i++)
   scanf("%d",&a[i]);
  lsum[0]=a[0];
  rsum[n-1]=a[n-1];
  b=a[0];
  for(k=1;k<=n-1;k++) {
   if(b>0) b+=a[k];
   else b=a[k];
   if(b>lsum[k-1]) lsum[k]=b;
   else  lsum[k]=lsum[k-1];
  }
  b=a[n-1];
  for(k=n-2;k>=0;k--) {
   if(b>0)   b+=a[k];
   else b=a[k];
   if(b>rsum[k+1]) rsum[k]=b;
   else rsum[k]=rsum[k+1];
  }
  for(k=0;k<=n-2;k++)
   if(lsum[k]+rsum[k+1]>sum) sum=lsum[k]+rsum[k+1];
  delete[] a;
  delete[] lsum;
  delete[] rsum;
  cout<<sum<<endl;
 }
 return 0;
}

 

PS:最好养成new过delete的习惯,我比较了下,一个耗内存800+K,一个12000+K,数据

再多些就要爆内存了。。

还有输入比较多时用scanf划算,省时呵呵。

 

 

 

 

 

 

Poj2479-Maximum sum Poj2479-Maximum sum 题意:给定一个数组,求两个不相交的连续子序列,使得其和最大。 分析:首先,对于一个序列,要求得一个连续子序列使其和最大的话,方法是多种的,即使预处理区间和,枚举区间的平方算法也显然不可行,效率十分低下,可以使用分治以O(nlogn)的复杂度来实现最大值的求解,但是存在O(n)的高效算法,那就是使用尺取法的思想不断地更新连续和的最大值。 具体实现 阅读详情

相关推荐

leetcode下载-algorithm-1:力扣、HDU、ZOJ、POJ

leetcode下载 Algorithm 每日一题 && 天天进步一点点 题目来于 LeetCode,剑指offer,Coding Interview,ZOJ,POJ 等平台。 欢迎Coders对代码加以指正和提议! 常见问题总结 两整数求平均值 average = min + (max - min) / 2 防止两整数的和越界 整数乘积对比 1.0 * m * m == num 类似乘积对比, 需转为double型, 避免整数溢出 两整数交换 i=i+j; j=i-j; i=i-j; 需注意i+j可能存在(同号)整数溢出问题 i=i-j; j=i+j; i=j-i; 需注意i-j可能存在(异号)整数溢出问题 i^=j; j^=i; i^=j; 判断某整数是否为2的整数次幂 问题转化为:判断整数是否为正整数且二进制中仅存在一位1 (n > 0 && (n & (n - 1)) == 0) 链表节点交换 修改next指针的值进行节点的交换 修改val字段的值 等价节点交换 练习: leetcode: 24. Swap Nodes in Pairs 练习: leetcode: 237. D

最大子段和问题

问题提出 有一由n个整数组成的序列A={a1,a2,…an,}A={a1,a2,…an,},截取其中从i→j的子段并计算字段和,那么最大的字段和为多少? 举例说明 例如: i 1 2 3 4 5 6 7 8 a[i] 1 3 -5 3 -2 5 -4 3 则其最大字段和为:3+(−2)+5=6 1. 动态规划算法 假设最大字段和我们设为 M 我们设 1→j中包括a[j]最大字...

lllfor的博客 313

ZYNQ实战:PS端驱动DMA实现高效数据流转与验证

本文详细介绍了在ZYNQ平台上通过PS端驱动DMA实现高效数据流转的实战方法。从ZYNQ的PS与PL数据交互基础出发,深入解析DMA核心价值,包括硬件平台搭建、Vivado配置、PS端软件架构设计及性能优化技巧,帮助开发者提升数据传输效率与系统性能。

weixin_29192141的博客 436

动态规划之最大子段和问题

问题描述:最大子段和问题是将一个n个整数的序列a[1],a[2]….a[n]中字段a[first]….a[last]之和,(1<=first<=last<=n)求这些子段和中最大的。 例如(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20,子段为a[2],a[3],a[4]。求解方法:如果不会算法,那就用时间复杂度为O(n^3

喵头鹰的博客 2万+

基于N32G003的PMBus从机协议栈设计与STM32F103模拟I2C主机通信实战

本文详细介绍了基于N32G003微控制器设计PMBus从机协议栈,并与STM32F103模拟I2C主机进行通信的实战方案。重点阐述了中断驱动架构、命令解析、CRC8优化及超时恢复机制,实现了在70kHz速率下稳定可靠的工业电源管理通信,适用于服务器电源、通信基站等成本敏感应用场景。

numpy6sculptor的博客 919

华为交换机密码策略配置避坑指南:明文/密文、长度、复杂度,一个命令就出错

本文详细解析华为交换机密码策略配置的关键要点,包括密码长度、复杂度及等保合规要求。通过实战案例揭示常见配置误区,如明文/密文密码格式差异、复杂度检查联动机制等,帮助网络工程师避免安全漏洞。特别针对等保二级和三级要求,提供可直接落地的安全加固方案。

weixin_30879169的博客 368

POJ 2479 最大子段和

POJ 2479 最大子段和 POJ 2479严格来说不是单纯的最大子段和,它是一个双向的最大子段和,为了弄清双向的最大子段和就必须弄清楚单向的最大子序和。 单向最大子段和问题如下: 在序列A[1..n](任意一个Ai都是整数,有正有负)中找出一个子序列A[p..q]使得M=Ap+Ap+1+…+Aq-1+Aq最大 例如如下的序列: 1 7 -8 -4 5 10 -9

二进制的宇宙 795

2025爬虫实战:某音直播间实时弹幕获取原理及源码分析

某音直播弹幕虽然没有直接挂在 DOM 上,但由于用的是西瓜播放器,弹幕是通过 JS 接口动态渲染的,这就给了我们 Hook 的机会。关键点是找到调用的位置,然后拦截并输出对象里的message字段。这个思路其实也适用于其他前端渲染的播放器,比如 B 站的 DPlayer、HLS.js、甚至很多自研播放器都有类似结构。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1815

最大子段和问题的四种解决办法

文章目录一、题目描述二、解决方法1.穷举法2.优化穷举法3.分治法4.动态规划 一、题目描述 Description 给定有n个整数(可能为负整数)组成的序列a1,a2,…,an,求该序列连续的子段和的最大值。 如果该子段的所有元素和是负整数时定义其最大子段和为0。 Input 第一行有一个正整数n(n<1000),后面跟n个整数,绝对值都小于10000。直到文件结束。 Output 输出它的最大子段和. Sample Input 6 -2 11 -4 13 -5 -2 Sample Output 2

Fariy_immortal的博客 5219

1-Wire 单总线硬件结构及软件时序分析(实测波形+C代码分析)

1根线就可以通信,是不是很神奇?因为其节省I/O口的优点而被广泛使用!

记得诚 1万+

实现真正的「人机」对战:引入三方 AI 引擎

引入三方 AI 引擎 前边,我们实现了与云库对战的象棋游戏。这一节中,我们将开始实现真正的「人机」对战 — 人与手机 AI 之间对弈; 实现一套象棋 AI 工程浩大,这个工作我们后续文章会做一番介绍。现代软件工程并不主张每个人都「造轮子」,因此我们要有「站在巨人肩膀上」的小智慧。 本节概要 从 github 寻找开源中象引擎 梳理引擎接入的思路 寻找适合的开源中国象棋引擎 github 上有大...

tosmart的博客 983

POJ 2479(动态规划)

一、题目大意 求连续的整数中两段不重叠的子串的最大值,运用动态规划可以很好地解决。 二、知识点回顾 先看看求一段子串的最大值是如何计算的。 读入的整数存在数组an中,设立新数组bn,b[i]存放以第i个元素结尾的子串的最大值,很显然,可以得出DP方程:b[i]=max(a[i],b[i-1]+a[i]) 程序如下: #include using namespace std

towads的博客 998

linux arm64 Debian12移植操作手册

2023年6月10号Debian官方出了debian12 arm64版本的。如果需要完全适配这个系统的话,需要linux6.10版本。应客户的需求,需要在Debian11升级为Debian12版本。

qq_45147279的博客 2169

POJ 2479解题日志——我的第一个解题日志

<br />poj 2479  <br />     学了一个星期动态规划,在网上参考别人的代码和心得的情况下终于把这个给AC了,为了自己的进步,第一次写解题日志。<br />     <br />    2479 即是求 两个不重叠子序列的最大和。先从左边开始把从第一个数到每一个数的最大子段和求出(存在dp[i]中),代码如下:<br />    1. for(i=0; i<n; i++){  <br />    2.     scanf("%d",&s[i]);  <br />    3. 

cssdnx的专栏 271

利用 SAP Joule 提升 ABAP 开发效率的前提条件与限制全解析

综上,想要在 ABAP Development Tools 中顺利使用 SAP Joule,既要准备好 BTP、IAS、ABAP 系统与 ADT 的版本与信任链,也要理解许可证、配额、语法范围等限制。只有在这些前提全部满足后,Joule 才能真正发挥生成式 AI 的价值,帮助 ABAP 开发者从繁琐模板中解放出来,把注意力投入在业务创新与 Clean Core 改造之上。未来 SAP 还将扩展中文语境、自动修复建议以及跨系统智能代理等功能,值得持续关注。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 664

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

POJ-2479

DP基础题 属于DP求最大字串和的变形 d1[x]代表在a[0,x]中,包含a[x](即a[x',x])的最优解——其实就是标准DP求最大字串是用的数组 c1[x]代表在a[0,x]中,可以不包含a[x]的最优解。 d2, c2是反向的,道理相同。 转移方程   d1[i] = (d1[i-1] < 0) ? (a[i]) : (d1[i-1] + a[i]);  ...

weixin_30776863的博客 132

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

动态规划点滴

本文记录我学习动态规划的点滴。嗯。我觉得每天写流水账,,对学习本身意义不大,所以从DP开始,写这样的记录帖子,流水账还是要写的。 昨天看了01背包,好不容易看明白了,写了个帖子

wh653的专栏 552

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

POJ 2479 (算不上简单的dp,可以称为简单的求两个子串和最大)

题意: 题意很简单,给n个数,求出两个无交叉的两段和最大,输出和。 思路: 一般会想到,求两次子串,但是问题是这样会出现重合的现象。 所以按照书上的方法是不合适的,所以需要另寻方法。问题是左串+右串,可不可> 以先把一种情况全部求出?可以的,比如把左边的每个最大串的和保存到一个数 组里面,然后再想办法找出右串,所以此时找到右串比较好的方法是用相同的方法从右边遍历,然后找到右串与

Since_natural_ran 1537

POJ2479

本题典型的动态规划,求得两个不相交连续字段和的最大值,所以这里我们需要明白,求两个字段和,一个是到i的字段和最大值,还有一个是从i开始的字段和最大值,以此来求解即可;AC代码如下: #include<iostream> #include<algorithm> #include<cstring> using namespace std; long long a[50005]; long long n; long long f_i[50005]; long long i_f[

juruodejinjie的博客 271

POJ2479 - Maximum sum (动规)

题目链接 : poj2479 - Maxinum sum思路 最大连续子列和 代码 思路题目要求的是,两段不相交的连续子列,使其加和最大。基础问题就是最大连续子列和,只要分别求得正序和逆序的最大和,然后枚举一边中间点,就可以得到结果。最大连续子列和解法有多种,这里用一种比较简单的动规的方法。 令 num[i]num[i] 表示序列中第 i 个数字, F(i)F(i) 为以第 i 个数字结尾的序列中

dcf_xyz的专栏 650

poj2479

大致思路: 求出每个位置的左边的最大数字串值和右边的最大数字串值之和,最大的和值为最终答案。 具体思路: 在输入的同时先求出每次输入时当前最大数字串值,并保存起来到对应的max【i】中,然后再从右往左以此求出到当前位置的右边数字串的最大数字串值,并与此位置左边最大数字串值加起来,所得之和最大的即为最终答案。 代码: #include&lt;stdio.h&gt; #include&lt...

a479778594的博客 729

Leetcode、poj图(basic(2))

阈值距离内邻居最少的城市 https://blog.youkuaiyun.com/m0_46217850/article/details/104330773 https://leetcode-cn.com/problems/find-the-city-with-the-smallest-number-of-neighbors-at-a-threshold-distance/

m0_46485428的博客 256

poj2479 Maximum sum

刚开始刷OJ,看大神对POJ上问题的分类,从动态规划的问题开始。对动态规划的理解不是很深刻,但是基本思路是分步解决问题,相同的子问题不重复计算,从而提升算法的效率。 对于这道题,我的思路是先从左到右,计算并存储每个节点(包括该节点)以前子范围的最大值。再从右向左,计算每个节点(包括该节点)以后的子范围的最大值,此时不必再存储该值,而直接计算该值与前半部分之和,并不断更新和的最大值。代码如下:

水之如此的专栏 550

秒懂百科,C++如此简单丨第五天:刷题软件的推荐及使用教程

从入门到精通,30天带你学会C++【第五天:刷题软件的推荐及使用教程】(学不会你找我)

m0_73787047的博客 5032

POJ 2479

题目描述 题意很简单,给一串数,让你求出两个无交叉的两个字串的和最大值,然后将两个最大值相加,输出和。 思路 先从左到右求出每个字串的和的最大值; 然后用相同的方法从右边遍历,然后找到每个。。。。。。。。。。。。。。。右串的和的最大值; 加上左串[i-1]的最大值,求最大,最后输出最大值。 AC代码 #include &lt;stdio.h&gt; #define ...

Jiaxin520的博客 395

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 255
下一篇: 漂亮打印问题与动规模型的建立
petercsj
博客等级 码龄18年 6粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值