【基础】dp系列1
序列双段最大子段和问题
(也许很水但蒟蒻刚刚学dp就来记录一下)
题意就是求序列中的任意两段的最大子段和最大。
我们先预处理出来前缀和,方便求最大子段和。
对于每一个i都求一遍1到i的最大子段和,即:
pre[1]=a[1];
minn=min(0,a[1]);
for(int i=2;i<n;i++){
minn=min(minn,a[i]);
pre[i]=max(pre[i-1],a[i]-minn);
}
其中,a数组是前缀和,直接处理的。
那么,我们再对n到1的每一个i求一遍最大子段和,即:
post[n]=a[n]-a[n-1];
maxn=a[n];
for(int i=n-1;i>1;i--){
maxn=max(maxn,a[i]);
post[i]=max(post[i+1],maxn-a[i-1]);
}
那么,接下来我们要做些什么?
枚举每一个i,从1到n-1,求出前i个数的最大子段和和i第i+1个数到n的最大子段和之和的最大值。
即:
ans=-inf;
for(int i=1;i<n;i++)ans=max(ans,pre[i]+post[i+1]);
printf("%d\n",ans);
完整代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#define inf 2147483647
using namespace std;
int t,n,a[50001];
int maxn,minn,pre[50001];
int post[50001],ans;
inline void solve(){
pre[1]=a[1];
minn=min(0,a[1]);
for(int i=2;i<n;i++){
minn=min(minn,a[i]);
pre[i]=max(pre[i-1],a[i]-minn);
}
post[n]=a[n]-a[n-1];
maxn=a[n];
for(int i=n-1;i>1;i--){
maxn=max(maxn,a[i]);
post[i]=max(post[i+1],maxn-a[i-1]);
}ans=-inf;
for(int i=1;i<n;i++)ans=max(ans,pre[i]+post[i+1]);
printf("%d\n",ans);
memset(pre,0,sizeof(pre));
memset(post,0,sizeof(post));
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",&a[i]),a[i]+=a[i-1];
solve();
}
return 0;
}
【基础】dp系列1的更多相关文章
- 基础知识系列☞C#中→属性和字段的区别
"好吧...准备写个'基础知识系列',算是记录下吧,时时看看,更加加深记忆···" 其实本来准备叫"面试系列"... 字段.属性.你先知道的哪个概念? ***我 ...
- 基础知识系列☞Abstract和Virtual→及相关知识
转载地址→http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的 ...
- saltstack之基础入门系列文章简介
使用saltstack已有一段时间,最近由于各种原因,特来整理了saltstack基础入门系列文章,已备后续不断查阅(俗话说好记性不如烂笔头),也算是使用此工具的一个总结.saltstack的前六篇文 ...
- 学习javascript基础知识系列第二节 - this用法
通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...
- 学习javascript基础知识系列第三节 - ()()用法
总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...
- 基础dp
队友的建议,让我去学一学kuangbin的基础dp,在这里小小的整理总结一下吧. 首先我感觉自己还远远不够称为一个dp选手,一是这些题目还远不够,二是定义状态的经验不足.不过这些题目让我在一定程度上加 ...
- 撸基础篇系列,JAVA的NIO部分
前言:撸基础篇系列,避免每次都要从头开始看,写个自己的知识体系树 NIO 核心就是异步, 比如,复制文件,让操作系统去处理,等通知 BIO核心类 一,BIO NIO基本操作类 Bytebuffer 构 ...
- MongoDB基础教程系列--未完待续
最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ...
- java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现
java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...
- java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别
java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别 目录 java基础解析系列(一)---String.StringBuffer.St ...
随机推荐
- Android开发之TextView中间设置横线,适用于电商项目,商品原价之类的功能。
textview.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG ); //中间横线 textview.getPaint().setFlags(Pai ...
- 【转】对初学LoadRunner朋友的建议
对初学LoadRunner朋友的建议 作者:wind摘要:随着Internet的普及与迅速发展,企业业务量的迅速加大,数据大集中成为一种趋势,IT系统承载的负荷越来越重,系统性能的好坏严重的影响了企业 ...
- Linux+Jenkins自动构建服务器包
何时使用: 测试过程中我们需要持续构建一个软件项目,为避免重复的手动下载.解压操作,我们需要搭建一个能够自动构建的测试环境,当代码有更新时,测试人员只需点一下[构建]即可拉取最新的代码进行测试(也可设 ...
- Python 利用三个简易模块熟悉前后端交互流程
准备工作 在学习Django之前,先动手撸一个简单的WEB框架来熟悉一下前后端交互的整体流程 本次用到的模块: 1.wsgiref,这是一个Python自带的模块,用于构建路由与视图 2.pymysq ...
- 一键部署k8s
本人学习安装kubernetes时,顺便整理了安装脚本,可以通过执行一个脚本,自动二进制安装好1台master+2台node的k8环境.方便需要学习k8s的同学. 百度网盘:https://pan.b ...
- Redis Linux 安装部署
Redis部署文档 Redis部署文档 准备软件: 开始部署: 解压tar包[root@localhost redis]# tar -zxvf redis-3.2.8.tar.gz 进入Redis ...
- cdispaly的Grid布局与Flex布局
cdispaly的Grid布局与Flex布局 Gird 布局与 Flex 布局有一定的相似性,都是对容器的内部项目进行划分. Flex 布局是轴线布局,只能指定项目针对轴线的位置,可以看作成一维布局 ...
- Agumaster 增加股票表台账页面
- 索引对单列极值查询的显著性影响(百万级别表单列最值查询 Cost由1405变成3)
表结构: create table hy_emp( id number(7,0) primary key, name nvarchar2(20) not null, salary number(5,0 ...
- 【Java/DateTime】用当前日期时间与确定日期时间比较,大于则执行某动作
代码: package logbackCfg; import java.text.ParseException; import java.text.SimpleDateFormat; import j ...