洛谷 P1121 环状最大两段子段和 题解
每日一题 day57 打卡
Analysis
对于这个问题,由于分成了两个子序列,我们不妨就是枚举一下可能出现的情况:
无非就这两种:
1.+++++0000+++++0000++++
2.0000++++00000++++000000
0就表示选了这个数,+就表示不选这个数,
那我们正反先做一个普通的最大子序列,就可以完成第2中情况,然后再求个最小子序列,把总和一减就是第1种情况。
至于求最小子序列,可以把数字都负过来,然后再搞个最大子序列就好了。
楼下举的例子非常对,我仔细思考了一下这个特例,即
4 -1 1 -1 -1
当我们将数字负过来时,就成了:
4 1 -1 1 1
此时的两个最大子序列我们会选成:
0+00 而首尾都选了,其实就是只选了一个序列,而这种特殊情况又只会在
只有一个数是正数时出现,所以特判一下就好了,如果只有一个数是正数,我们就不做将数字负过来后的那个最大子序列了,
直接找两个最大的数累和就行了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define maxn 200000+10
#define INF 2147483647
#define rep(i,s,e) for(register int i=s;i<=e;++i)
#define dwn(i,s,e) for(register int i=s;i>=e;--i)
using namespace std;
inline int read()
{
int x=,f=;
char c=getchar();
while(c<''||c>'') {if(c=='-') f=-; c=getchar();}
while(c>=''&&c<='') {x=x*+c-''; c=getchar();}
return f*x;
}
inline int write(int x)
{
if(x<) {putchar('-'); x=-x;}
if(x>) write(x/);
putchar(x%+'');
}
int n,sum1,sum2;
int a[maxn],dp_top[maxn],dp_back[maxn];
inline int calc()
{
int res=-INF;
rep(i,,n) dp_top[i]=max(dp_top[i-],0ll)+a[i];
dwn(i,n,) dp_back[i]=max(dp_back[i+],0ll)+a[i];
rep(i,,n) dp_top[i]=max(dp_top[i-],dp_top[i]);
dwn(i,n,) dp_back[i]=max(dp_back[i+],dp_back[i]);
rep(i,,n-) res=max(res,dp_top[i]+dp_back[i+]);
return res;
}
signed main()
{
memset(a,,sizeof(a));
n=read();
rep(i,,n)
{
a[i]=read();
sum1+=a[i];
if(a[i]>) sum2+=a[i];
}
if(sum2==)
{
int minn1=-INF,num=;
rep(i,,n)
{
if(a[i]>minn1)
{
minn1=a[i];
num=i;
}
}
a[num]=-INF;
int minn2=-INF;
rep(i,,n)
if(a[i]>minn2) minn2=a[i];
write(minn1+minn2);
return ;
}
int ans1=calc();
rep(i,,n) a[i]=-a[i];
int ans2=sum1+calc();
if(ans2==) ans2=-INF;
write(max(ans1,ans2));
return ;
}
请各位大佬斧正(反正我不认识斧正是什么意思)
洛谷 P1121 环状最大两段子段和 题解的更多相关文章
- 洛谷 P1121 环状最大两段子段和 解题报告
P1121 环状最大两段子段和 题目描述 给出一段环状序列,即认为\(A_1\)和\(A_N\)是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 第一行是一个正整数 ...
- 洛谷P1121 环状最大两段子段和
题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的第一行是一个正整数N,表示了序列 ...
- 洛谷 P1121 环状最大两段子段和
https://www.luogu.org/problemnew/show/P1121 不会做啊... 看题解讲的: 答案的两段可能有两种情况:一是同时包含第1和第n个,2是不同时包含第1和第n个 对 ...
- P1121 环状最大两段子段和
P1121 环状最大两段子段和 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的 ...
- P1121 环状最大两段子段和(DP)
P1121 环状最大两段子段和 难度 提高+/省选- 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件 ...
- luogu P1121 环状最大两段子段和
嘟嘟嘟 一道说难也难说简单也简单的dp题. 我觉得我的(有篇题解)做法就属于特别简单的. 平时遇到环的问题都是断环为链,但这道题给了一种新的思路. 观察一下,最后的答案无非就这两种:xxx--xx-- ...
- 【u124】环状最大两段子段和
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. ...
- luogu 1121 环状最大两段子段和
题目大意: 一个序列看做一个环 选两段数使它们和最大 思路: 定义一个dp数组i j 0/1 表示前i个取了连续的j段 0/1表示取不取第i个 但是因为看做一个环 首尾相接的情况可以看做是选三段,其中 ...
- Luogu1121:环状最大两段子段和
题面 传送门 Sol 两种情况 第一种就是类似\(***000***000***(0表示选)\),这个可以DP 设\(h[0/1/2/3][i]\)表示到第\(i\)位的状态: \(0\):表示还没选 ...
随机推荐
- DDR3(4):读控制
写控制完成后开始设计读控制,写控制和读控制是非常相似的. 一.总线详解 由 User Guide 可知各信号之间的逻辑关系,读数据是在给出命令之后一段时间后开始出现的.图中没有给出app_rd_dat ...
- Dart面向对象编程(一)
基本内容概述: 类与对象: 计算属性: void main(){ var rect = new Rectangle(); rect.width = 20; rect.height = 10; prin ...
- CSP-S2019 自闭记
$Day0:$ 最后一场zr十连测从200挂到60,嘴上说着攒rp心里觉得药丸. 得知自己在本校考试感觉8错. $Day1:$ 早上7点50到了校门口,没让进QAQ早知道我再下一把棋了. 于是跟熊聊天 ...
- 『正睿OI 2019SC Day6』
动态规划 \(dp\)早就已经是经常用到的算法了,于是老师上课主要都在讲题.今天讲的主要是三类\(dp\):树形\(dp\),计数\(dp\),\(dp\)套\(dp\).其中计数\(dp\)是我很不 ...
- Remote System Explorer Operation总是运行后台服务,卡死eclipse解决办法
当你右键编辑控件的id或者其他属性时都会卡很久,发现原来是eclipse后台进程在远程操作,就是右下角显示的“Remote System Explorer Operation”.折腾了半天,在Stac ...
- C# GDI graphics.DrawImage 的参数问题
graphics.DrawImage(imageSource, new System.Drawing.Point[] { ,), , ), , ), } ); graphics.DrawImage(i ...
- C# Mysql数据库备份、还原(MVC)
一.准备工作 1.电脑上要安装上mysql,并且已经配置好了环境变量. 二.公共代码 1.配置文件(该节点只是为备份.还原使用,数据库连接字符串有另外的节点) <connectionString ...
- Deepo
Deepo is a series of Docker images that allows you to quickly set up your deep learning research env ...
- 分布式图片服务器FastDFS
1. 什么是FastDFS FastDFS 是用 c 语言编写的一款开源的分布式文件系统.FastDFS 为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使 ...
- UIDatePicker基本使用
UIDatePicker提供了一个快速选择日期和时间的控件,他是UIControl的子类,专门用于日期时间的选择.其样式可以通过UIDatePicker的属性进行灵活设置,同时也可以获取到当前UIDa ...