题解 P2642 【双子序列最大和】
前言
其实这道题的关键就是在于预处理,其方法类似于 合唱队形
正文
求最大子段和
要想求出双子序列最大和,首先我们要会求出最大子段和
最大子段和的求值方法很简单
定义 \(f_i\) 为以第 \(i\) 个数结尾的最大子段和
#include <bits/stdc++.h>
using namespace std;
int f[1000010],a[1000010];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
f[1]=a[1];
for(int i=2;i<=n;i++)f[i]=max(f[i-1]+a[i],a[i]);
int ans=f[1];
for(int i=2;i<=n;i++)ans=max(ans,f[i]);
cout<<ans;
return 0;
}
求双子序列最大和
那么我们现在可以去求双子序列最大和
怎么求,思路是

如果你去枚举中间的数,然后去算左边的最大子段,再算出右边的最大子段,加起来,用打擂法,求出最大值,你会 \(TLE\),毕竟\(n<=10^{6}\)
那怎么办?我们可以预处理
我们可以用 \(O(n)\) 的时间计算到前 \(1\) 个数的最大子段,
我们可以用 \(O(n)\) 的时间计算到后 \(i\) 个数的最大子段
像这样
cin>>n;
for(int i=1;i<=n;i++)cin>>x[i];
f[1]=x[1];
for(int i=2;i<=n;i++)f[i]=max(f[i-1]+x[i],x[i]);//算最大子段
for(int i=2;i<=n;i++)f[i]=max(f[i-1],f[i]);//更新成最大值
l[n]=x[n];
for(int i=n-1;i>=1;i--)l[i]=max(l[i+1]+x[i],x[i]);//算最大子段
for(int i=n-1;i>=1;i--)l[i]=max(l[i+1],l[i]);//更新成最大值
这里 \(f_i\) 表示前 \(i\) 个数中的最大字段和
这里 \(l_i\) 表示后 \(i\) 个数中的最大字段和
然后,用 \(O(n)\) 的时间去枚举中间的数,打擂法求出双子序列最大和
上代码:
#include<bits/stdc++.h>
using namespace std;
long long x[1000010],f[1000010],l[1000010];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>x[i];
f[1]=x[1];
for(int i=2;i<=n;i++)f[i]=max(f[i-1]+x[i],x[i]);//算最大子段
for(int i=2;i<=n;i++)f[i]=max(f[i-1],f[i]);//算最大子段
l[n]=x[n];
for(int i=n-1;i>=1;i--)l[i]=max(l[i+1]+x[i],x[i]);//算最大子段
for(int i=n-1;i>=1;i--)l[i]=max(l[i+1],l[i]);//算最大子段
long long ans=f[1]+l[3];
for(int i=3;i<n;i++)ans=max(ans,f[i-1]+l[i+1]);//枚举中间数
cout<<ans;
return 0;
}
后记
这种预处理的方法可以优化我们的时间复杂度,避免重复计算,使我们的程序跑得更快!
题解 P2642 【双子序列最大和】的更多相关文章
- 【dp】P2642 双子序列最大和
题目描述 给定一个长度为n的整数序列,要求从中选出两个连续子序列,使得这两个连续子序列的序列和之和最大,最终只需输出最大和.一个连续子序列的和为该子序列中所有数之和.每个连续子序列的最小长度为1,并且 ...
- 简单DP【p2642】双子序列最大和
Description 给定一个长度为n的整数序列,要求从中选出两个连续子序列,使得这两个连续子序列的序列和之和最大,最终只需输出最大和.一个连续子序列的和为该子序列中所有数之和.每个连续子序列的最小 ...
- [Luogu 2642] 双子序列最大和
Description 给定一个长度为n的整数序列,要求从中选出两个连续子序列,使得这两个连续子序列的序列和之和最大,最终只需输出最大和.一个连续子序列的和为该子序列中所有数之和.每个连续子序列的最小 ...
- 【题解】SDOI2015序列统计
[题解]SDOI2015序列统计 来自永不AFO的YYB的推荐 这里是乘积,比较麻烦,不过由于给定的序列膜数是个小质数,所以可以\(O(m^2\log m)\)找原跟(实际上不需要这么多). 乘积有点 ...
- 【题解】FBI序列
题目描述 两伙外星人策划在未来的XXXX年侵略地球,侵略前自然要交换信息咯,现在,作为全球保卫队队长,你截获了外星人用来交换信息的一段仅由“F”,“B”,“I”,“O”组成的序列.为了保卫地球和平,为 ...
- 题解【bzoj1251 序列终结者】
Description 维护三个操作:区间加,区间翻转,区间求最大值.\(n \leq 50000\) Solution fhqtreap大法好! 模板题(我是不会告诉你这篇题解是用来存个代码的 Co ...
- 【题解】HNOI2016序列
也想了有半天,没有做出来……实际上做法确实也是十分精妙的.这里推荐一个blog,个人认为这位博主讲得挺好了:Sengxian's Blog; 感觉启示是:首先要加强对莫队算法 & ST表的熟练 ...
- [题解] LuoguP3321 [SDOI2015]序列统计
感觉这个题挺妙的...... 考虑最暴力的\(dp\),令\(f[i][j]\)表示生成大小为\(i\)的序列,积为\(j\)的方案数,这样做是\(O(nm)\)的. 转移就是 \[ f[i+1][j ...
- 【笔记】入门DP(Ⅱ)
0X00 P1433 吃奶酪 状压 \(DP\),把经过的点压缩成01串.若第 \(i\) 位为 \(0\) 表示未到达,为 \(1\) 则表示已到达. 用 \(f[i][j]\) 表示以 \(i\) ...
随机推荐
- mac电脑终端使用scp上传/下载文件/文件夹
1.从服务器下载文件到本地电脑 1 scp -r remote_username@remote_ip:remote_folder local_folder 例如: 1 scp -r root@106. ...
- appium使用相对坐标定位元素
最近在用appium做自动化时发现,有一些元素无法通过uiautomatorviewer进行定位,这样就只能通过相对坐标来进行定位了.但是,问题又来了:如何获取元素的坐标呢? 在网上找了半天也没找到相 ...
- Y事业部打造一体化质量管理平台
互联网企业质量管理的困惑 作为互联网时代的互联网企业,我们的研发模式和传统模式相比,最显著的不同在于发布节奏加快了,这个加快不是快了10%,20%,50%,而是加快了几倍,甚至几十倍,上百倍.面对加快 ...
- 软件测试价值观-SMBT新理念
软件测试价值观-SMBT新理念 作者:张元礼 http://blog.csdn.net/vincetest 近年来有不少软件测试同行不少有些困惑-软件测试人员的价值在哪里?我们怎么才能做好软件测试?怎 ...
- FPGA小白学习之路(2)error:buffers of the same direction cannot be placed in series
锁相环PLL默认输入前端有个IBUFG单元,在输出端有个BUFG单元,而两个BUFG(IBUFG)不能相连,所以会报这样的错: ERROR:NgdBuild:770 - IBUFG 'u_pll0/c ...
- [红日安全]Web安全Day4 - SSRF实战攻防
本文由红日安全成员: MisakiKata 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目 ...
- py面向对象编程基础
'''类:一类事物的抽象,用于定义抽象类型 实例:类的单个实际描述 如:人是一个类,而单个人是一个实例 用class来创建一个类,调用一个类来创建一个实例'''class Person: passxi ...
- FreeModBus源码解析(1)---开篇
一.设计思想 任何通信协议的实现都是基于状态机的设计思想,就是来了一串数据判断是是干啥的在调用相应的处理函数只不过高手一般采用回调处理. 如果你熟悉了回调.源码里的状态机的实现又可以理解,那么恭喜你已 ...
- 峰哥说技术:02-第一个Spring Boot应用程序
Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 02第一个Spring Boot应用程序 1.版本要求 集成开发环境:IntelliJ IDEA 2017 ...
- 第八章、小节二vuex
a.用vuex首先先安装vuex npm install vuex --save b.在src目录下创建store文件夹,在store中创建index.js存放各个状态 c.在一个模块化的打包系统中, ...