【基础】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 ...
随机推荐
- c++ binding code generator based on clang
google it http://www.swig.org/Doc3.0/CSharp.html http://samanbarghi.com/blog/2016/12/06/generate-c-i ...
- Texstudio、Latex 大段注释,多行注释 快捷键
Texstudio.Latex 大段注释,多行注释 快捷键 单行注释:在每行前加 % 即可 大段注释: \usepackage{verbatim} \begin{comment} ... \end ...
- 新三种求数列中值SQL之效率再比拼
在 https://www.cnblogs.com/xiandedanteng/p/12677688.html 中我列举了三种求中值方案,其中日本人MICK的做法因为不适用于二百万结果集而放弃,取而 ...
- [Java]取得当前代码所在函数的函数名
要取得当前运行代码的函数名,可以用: Thread.currentThread().getStackTrace()[1].getMethodName(); 但是,这行代码有些过长,嵌入业务代码稍显突兀 ...
- Kubernetes中资源清单与Pod的生命周期(二)
一.资源清单 1,定义: 在k8s中一般使用yaml格式的文件来创建符合我们预期的资源,这样的yaml被称为资源清单. 使用资源清单创建Pod: kubectl apply -f nginx.yaml ...
- 10行实现最短路算法——Dijkstra
今天是算法数据结构专题的第34篇文章,我们来继续聊聊最短路算法. 在上一篇文章当中我们讲解了bellman-ford算法和spfa算法,其中spfa算法是我个人比较常用的算法,比赛当中几乎没有用过其他 ...
- 7.SwrContext音频重采样使用
头文件位于#include <libswresample/swresample.h> SwrContext常用函数如下所示 SwrContext *swr_alloc(void); / ...
- pytest测试框架 -- skip跳过执行测试用例
跳过执行测试用例 1.@pytest.mark.skip(reason=" ") -- 跳过执行测试函数 可传入一个非必须参数reason表示原因 import pytest@ ...
- JavaFx在Main中获取Controller初始化相关配置和Fxml
Main中的方法 package sample; import javafx.application.Application; import javafx.fxml.FXMLLoader; impor ...
- 软件工程与UML作业1
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...