P1121 环状最大两段子段和

难度 提高+/省选-

题目描述

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

输入输出格式

输入格式:

输入文件maxsum2.in的第一行是一个正整数N,表示了序列的长度。

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

输出格式:

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

输入输出样例

输入样例#1:

7

2 -4 3 -1 2 -4 3

输出样例#1:

9

说明

【样例说明】

一段为3

/*
DP.
最大子段和问题.
n^2的做法是
拆成链对每一个区间维护最大前缀/后缀和.
然后枚举断点.
这个很好想但过不了so没打(懒~).
看了看题解orz.
恩o(n).
最大子段和无非就有两种情况.
(1)跨区间的.
(2)在[1,n]中的.
然后难搞的可能是(1).
然后我们换个思路.
我们在[1,n]中求一个最小前缀/后缀和.
然后用sum减去即可.
正确性是显然的.
因为求最小的时候我们默认包括[i,i+1].
这段不选的最小子段区间必定是连续的.
故选的必定为1段(如果选的是[1,i],[i+1,n]这一段
我们也可以认为它们是分开选的两段).
*/
#include<iostream>
#include<cstdio>
#define MAXN 200001
using namespace std;
int maxl[MAXN],maxr[MAXN],minl[MAXN],minr[MAXN],n,s[MAXN],sum,ans=-1e9,max1,min1;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
int main()
{
n=read();
for(int i=1;i<=n;i++) s[i]=read(),sum+=s[i];
maxl[1]=minl[1]=max1=min1=s[1];
for(int i=2;i<=n;i++)
{
if(max1>0) max1+=s[i];
else max1=s[i];
if(min1<0) min1+=s[i];
else min1=s[i];
maxl[i]=max(maxl[i-1],max1);
minl[i]=min(minl[i-1],min1);
}
maxr[n]=minr[n]=max1=min1=s[n];
for(int i=n-1;i>=1;i--)
{
if(max1>0) max1+=s[i];
else max1=s[i];
if(min1<0) min1+=s[i];
else min1=s[i];
maxr[i]=max(maxr[i+1],max1);
minr[i]=min(minr[i+1],min1);
}
for(int i=1;i<=n-1;i++)
{
ans=max(ans,maxl[i]+maxr[i+1]);
if(sum-minl[i]-minr[i+1]) ans=max(ans,sum-minl[i]-minr[i+1]);
} printf("%d",ans);
return 0;
}

最新文章

  1. iOS调试通过UILocalNotification或RemoteNotification启动的app
  2. 2016/11/16 周三 &lt;使用LocalStore记住用户密码方法示例&gt;
  3. MySQL中的while、repeat、loop循环
  4. 微软注册dll在dotnet开发时起到缓存的作用
  5. sscanf()函数的使用及其实例
  6. poj 3661 Running
  7. C++中的一些定义
  8. 使用PSSH批量SSH操作Linux服务器
  9. 最近整理的一些行列转换sql(有自己的,有别人的),留作记录
  10. sybase 备份和恢复
  11. Java EE (1) -- Java EE 6 Web Component Developer Certified Expert(1z0-899)
  12. artTemplate模板
  13. WinRAR5.31 注册码
  14. 用javascript实现完全的类(private、pubulic等)
  15. vue2重写饿了么
  16. 程序员的自我救赎---1.4.1:核心框架讲解(DAL)
  17. 同一台机器上多个tomcat启动造成的内存溢出问题的解决方法。
  18. 简易调色盘控件 for .NET(EN)
  19. 使用mysqlbinlog恢复数据
  20. javaweb(4)之Listener&amp;Filter

热门文章

  1. Katu Puzzle POJ - 3678 (2 - sat)
  2. Latex使用记事(1)
  3. MySQL解惑——GROUP BY隐式排序
  4. gridview单元格编辑添加数据
  5. Left4Dead2 LAN Online
  6. uni app以及小程序 --环境搭建以及编辑器
  7. 云端js动态效果
  8. Linux 永久挂载镜像文件和制作yum源
  9. C# Monitor Wait()和Pulse()
  10. Win10 OpenCV3.3.0+VS2013配置大坑,OpenCV解决方案编译报错“找不到python36_d.lib”错误