P1121 环状最大两段子段和

题目描述

给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大。

输入输出格式

输入格式:

输入文件maxsum2.in的第一行是一个正整数N(N\le 2\times 10^{5})(N≤2×10​5​​),表示了序列的长度。

第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列,第一个数和第N个数是相邻的。

输出格式:

输入文件maxsum2.out仅包括1个整数,为最大的两段子段和是多少。

输入输出样例

输入样例#1:

7
2 -4 3 -1 2 -4 3

输出样例#1:

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 环状最大两段子段和相关推荐

  1. 记录两段经典标定代码

    这两段是HALCON给出的分别标定内参和外参的代码,过程和OPENCV类似,但是标定外参更具有参考价值.记录一下 ImgPath := '3d_machine_vision/calib/' dev_c ...

  2. 两段用来启动/重启Linux下Tomcat的Perl脚本

    两段代码,第二段比较好些. 下面是Split输出结果方式的代码: #!/usr/local/bin/perl #Date:2015-07-07 print "Begin to restart ...

  3. 单一窗口关区备案_【干货】上海国际贸易单一窗口货物申报对接版(信天翁)“两段准入” 操作手册...

    上海国际贸易单一窗口货物申报对接版 (信天翁)"两段准入" 操作手册 什么是"两段准入"? 2019年10月16日,海关总署发布<关于分段实施准入监管 加 ...

  4. mysql 隐式锁和显示锁_锁的类型以及粒度,两段锁协议,隐式和显示锁

    锁的粒度 行级锁 表级锁 应尽量只锁定需要修改的那部分数据,而不是所有资源.锁定的数据量越少,发生锁争用的可能性就越小,并发行就越高. 加锁需要消耗资源,锁的各种操作都会增加系统开销.因此锁的粒度越小 ...

  5. python 列表比较不同_python实现比较两段文本不同之处的方法

    本文实例讲述了python实现比较两段文本不同之处的方法.分享给大家供大家参考.具体实现方法如下: # find the difference between two texts # tested w ...

  6. 事务管理基础:两段锁协议、活锁、死锁相关知识整理

    1.两段锁协议(Two-phase Locking Protocol)  两段锁协议是指对任何数据进行读写之前必须对数据进行加锁:在释放一个封锁之后,事务不再申请和获得任何其他封锁. 两段锁协议中两段 ...

  7. 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段,然后根据 ...

  8. 如何匹配两段文本的语义?

    喵喵喵,好久不见啦.首先很抱歉大家期待的调参手册(下)迟迟没有出稿,最近两个月连着赶了4个DDL,整个人都不好了.最近几天终于有时间赶一下未完成的稿子了.在赶DDL的时候夹着写了这篇文章,就先发布这一 ...

  9. 一个困扰数学家的古老谜题:意大利面能否被折成两段?

    图片来源:R. Heisser et. al.  ○你能将一根意大利面折成两段吗?  如果你碰巧有一盒意大利面条,不妨尝试做一下这个实验: 拿出一根意大利面,将两端对折,直到折断.你将意大利面折成了多 ...

最新文章

  1. java 获取动态的service_【Android】动态代理在 Retrofit 中的使用
  2. 通过反射实现IOC功能
  3. 用C/C++编写window服务
  4. vc6.0开发环境两个辅助工具
  5. 手机照片导入电脑步骤_手机录屏及电脑录屏操作步骤
  6. 工程师也是主播界“扛把子”,学员抱紧大腿痴痴等候百度AI快车道下期到来...
  7. The finally block does not always execute in try finally
  8. Linux / Unix Command: getprotobyname
  9. VC++2012编程演练数据结构《25》线索二叉树
  10. Java之戳中痛点 - (5)switch语句break不能忘以及default不同位置的用法
  11. 5 分钟掌握智联招聘网站爬取并保存到 MongoDB 数据库
  12. .NET 应用从 Visual Studio 迁移到 Eclipse
  13. soapui oracle groovy,SoapUI Groovy 使用实例
  14. 小程序 做二维码带logo绘制二维码
  15. php 翻转180度,如何翻转视频—将视频翻转90或180度
  16. 路由器桥接dns服务器未响应,360路由器无线桥接的设置方法(电脑)?
  17. bom实现方块移动_HTML 方块移动
  18. 计划评审技术(PERT)求工期、标准差、方差以及概率
  19. poj 2152 Fire - 经典树形dp
  20. HDMI2.0/HDCP2.2 4x2 矩阵——GSV2008

热门文章

  1. PMAboutView
  2. Skin设计小组新作品发布—绿草蓝天
  3. 组态王图素制作_组态王的图形及动画功能
  4. caffe:Data 层
  5. 【LDA学习系列】Dirichlet分布python代码
  6. 【Python-ML】抽取最优化分类的特征子空间的LDA方法
  7. Nutch爬虫引擎使用分析
  8. 算法谜题 php,JavaScript实现N皇后问题算法谜题解答_javascript技巧
  9. JDK源码解析 Runable是一个典型命令模式,Runnable担当命令的角色,Thread充当的是调用者,start方法就是其执行方法
  10. Learn About Bundles and the Request Lifecycle——未完待续