P1121 环状最大两段子段和
P1121 环状最大两段子段和
题目描述
给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大。
输入输出格式
输入格式:
输入文件maxsum2.in的第一行是一个正整数N(N\le 2\times 10^{5})(N≤2×105),表示了序列的长度。
第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列,第一个数和第N个数是相邻的。
输出格式:
输入文件maxsum2.out仅包括1个整数,为最大的两段子段和是多少。
输入输出样例
7 2 -4 3 -1 2 -4 3
9
说明
【样例说明】
一段为3
分析:
环变链的方法不行,环变链以后,DP求出来的最大值序列长度不定,两个区间可能重复。
那么只能在原有的序列上做了。
答案无非两种情况:
(假装是图示:0不选,+选)
情况1:000+++++++000000+++++000000
情况2:+++++000000+++++000000+++++
以上都是环,也就是说左右端点相连。
可以看出,情况1的最优解就是在原序列上求两个和最大的子段。
情况2的最优解就是在原序列上求两个和最小的子段,用总和减一下。
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const int mxn=200010; 10 int read(){ 11 int x=0,f=1;char ch=getchar(); 12 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 13 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} 14 return x*f; 15 } 16 int n; 17 int a[mxn]; 18 int f1[mxn],f2[mxn],d1[mxn],d2[mxn]; 19 int smm=0; 20 int main(){ 21 int i,j; 22 //读取数据 23 n=read(); 24 for(i=1;i<=n;i++)a[i]=read(),smm+=a[i]; 25 int nmx=-1e9,nmi=1e9; 26 f1[0]=-1e9;d1[0]=1e9; 27 //从前往后求 28 //f1[]是最大的子段,d1[]是最小的子段 29 for(i=1;i<=n;i++){ 30 nmx=max(nmx+a[i],a[i]); 31 nmi=min(nmi+a[i],a[i]); 32 f1[i]=max(f1[i-1],nmx); 33 d1[i]=min(d1[i-1],nmi); 34 } 35 nmx=-1e9;nmi=1e9; 36 f2[n+1]=-1e9;d2[n+1]=1e9; 37 //从后往前求 38 //f2[]是最大的子段,d2[]是最小的子段 39 for(i=n;i;i--){ 40 nmx=max(nmx+a[i],a[i]); 41 nmi=min(nmi+a[i],a[i]); 42 f2[i]=max(f2[i+1],nmx); 43 d2[i]=min(d2[i+1],nmi); 44 } 45 // 46 int ans=-1e9; 47 for(i=1;i<n;i++){ 48 //两个最大的子段 49 ans=max(ans,f1[i]+f2[i+1]); 50 //两个两个最小的子段 51 if(smm-d1[i]-d2[i+1])ans=max(ans,smm-d1[i]-d2[i+1]); 52 } 53 cout<<ans<<endl; 54 return 0; 55 }
转载于:https://www.cnblogs.com/Renyi-Fan/p/7429408.html
P1121 环状最大两段子段和相关推荐
- 记录两段经典标定代码
这两段是HALCON给出的分别标定内参和外参的代码,过程和OPENCV类似,但是标定外参更具有参考价值.记录一下 ImgPath := '3d_machine_vision/calib/' dev_c ...
- 两段用来启动/重启Linux下Tomcat的Perl脚本
两段代码,第二段比较好些. 下面是Split输出结果方式的代码: #!/usr/local/bin/perl #Date:2015-07-07 print "Begin to restart ...
- 单一窗口关区备案_【干货】上海国际贸易单一窗口货物申报对接版(信天翁)“两段准入” 操作手册...
上海国际贸易单一窗口货物申报对接版 (信天翁)"两段准入" 操作手册 什么是"两段准入"? 2019年10月16日,海关总署发布<关于分段实施准入监管 加 ...
- mysql 隐式锁和显示锁_锁的类型以及粒度,两段锁协议,隐式和显示锁
锁的粒度 行级锁 表级锁 应尽量只锁定需要修改的那部分数据,而不是所有资源.锁定的数据量越少,发生锁争用的可能性就越小,并发行就越高. 加锁需要消耗资源,锁的各种操作都会增加系统开销.因此锁的粒度越小 ...
- python 列表比较不同_python实现比较两段文本不同之处的方法
本文实例讲述了python实现比较两段文本不同之处的方法.分享给大家供大家参考.具体实现方法如下: # find the difference between two texts # tested w ...
- 事务管理基础:两段锁协议、活锁、死锁相关知识整理
1.两段锁协议(Two-phase Locking Protocol) 两段锁协议是指对任何数据进行读写之前必须对数据进行加锁:在释放一个封锁之后,事务不再申请和获得任何其他封锁. 两段锁协议中两段 ...
- HDU - 1024 Max Sum Plus Plus 最大m段子段和+滚动数组优化
给定n个数字,求其中m段的最大值(段与段之间不用连续,但是一段中要连续) 例如:2 5 1 -2 2 3 -1五个数字中选2个,选择1和2 3这两段. dp[i][j]从前j个数字中选择i段,然后根据 ...
- 如何匹配两段文本的语义?
喵喵喵,好久不见啦.首先很抱歉大家期待的调参手册(下)迟迟没有出稿,最近两个月连着赶了4个DDL,整个人都不好了.最近几天终于有时间赶一下未完成的稿子了.在赶DDL的时候夹着写了这篇文章,就先发布这一 ...
- 一个困扰数学家的古老谜题:意大利面能否被折成两段?
图片来源:R. Heisser et. al. ○你能将一根意大利面折成两段吗? 如果你碰巧有一盒意大利面条,不妨尝试做一下这个实验: 拿出一根意大利面,将两端对折,直到折断.你将意大利面折成了多 ...
最新文章
- java 获取动态的service_【Android】动态代理在 Retrofit 中的使用
- 通过反射实现IOC功能
- 用C/C++编写window服务
- vc6.0开发环境两个辅助工具
- 手机照片导入电脑步骤_手机录屏及电脑录屏操作步骤
- 工程师也是主播界“扛把子”,学员抱紧大腿痴痴等候百度AI快车道下期到来...
- The finally block does not always execute in try finally
- Linux / Unix Command: getprotobyname
- VC++2012编程演练数据结构《25》线索二叉树
- Java之戳中痛点 - (5)switch语句break不能忘以及default不同位置的用法
- 5 分钟掌握智联招聘网站爬取并保存到 MongoDB 数据库
- .NET 应用从 Visual Studio 迁移到 Eclipse
- soapui oracle groovy,SoapUI Groovy 使用实例
- 小程序 做二维码带logo绘制二维码
- php 翻转180度,如何翻转视频—将视频翻转90或180度
- 路由器桥接dns服务器未响应,360路由器无线桥接的设置方法(电脑)?
- bom实现方块移动_HTML 方块移动
- 计划评审技术(PERT)求工期、标准差、方差以及概率
- poj 2152 Fire - 经典树形dp
- HDMI2.0/HDCP2.2 4x2 矩阵——GSV2008
热门文章
- PMAboutView
- Skin设计小组新作品发布—绿草蓝天
- 组态王图素制作_组态王的图形及动画功能
- caffe:Data 层
- 【LDA学习系列】Dirichlet分布python代码
- 【Python-ML】抽取最优化分类的特征子空间的LDA方法
- Nutch爬虫引擎使用分析
- 算法谜题 php,JavaScript实现N皇后问题算法谜题解答_javascript技巧
- JDK源码解析 Runable是一个典型命令模式,Runnable担当命令的角色,Thread充当的是调用者,start方法就是其执行方法
- Learn About Bundles and the Request Lifecycle——未完待续