序列双段最大子段和问题

(也许很水但蒟蒻刚刚学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的更多相关文章

  1. 基础知识系列☞C#中→属性和字段的区别

    "好吧...准备写个'基础知识系列',算是记录下吧,时时看看,更加加深记忆···" 其实本来准备叫"面试系列"... 字段.属性.你先知道的哪个概念? ***我 ...

  2. 基础知识系列☞Abstract和Virtual→及相关知识

    转载地址→http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的 ...

  3. saltstack之基础入门系列文章简介

    使用saltstack已有一段时间,最近由于各种原因,特来整理了saltstack基础入门系列文章,已备后续不断查阅(俗话说好记性不如烂笔头),也算是使用此工具的一个总结.saltstack的前六篇文 ...

  4. 学习javascript基础知识系列第二节 - this用法

    通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...

  5. 学习javascript基础知识系列第三节 - ()()用法

    总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...

  6. 基础dp

    队友的建议,让我去学一学kuangbin的基础dp,在这里小小的整理总结一下吧. 首先我感觉自己还远远不够称为一个dp选手,一是这些题目还远不够,二是定义状态的经验不足.不过这些题目让我在一定程度上加 ...

  7. 撸基础篇系列,JAVA的NIO部分

    前言:撸基础篇系列,避免每次都要从头开始看,写个自己的知识体系树 NIO 核心就是异步, 比如,复制文件,让操作系统去处理,等通知 BIO核心类 一,BIO NIO基本操作类 Bytebuffer 构 ...

  8. MongoDB基础教程系列--未完待续

    最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ...

  9. java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现

    java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...

  10. java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别

    java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别 目录 java基础解析系列(一)---String.StringBuffer.St ...

随机推荐

  1. android开发中防止刚进入activity时edittext获取焦点,防止自动自动弹出软键盘

    刚进入activity的时候,如果布局组件有edittext的话,往往edittext会获取焦点,自动弹出软键盘,影响整个界面的视觉效果.解决方法如下: 可以在edittext的父布局结构中(例如Li ...

  2. asp image

    @Url.Content("~/Content/images/myimage.png") <img src="~/Content/images/myimage.pn ...

  3. Transform与Vector3 的API

    Transform.InverseTransformDirection(Vector3 direction) Vector3.ProjectOnPlane(Vector3 vector, Vector ...

  4. 【小白学PyTorch】6 模型的构建访问遍历存储(附代码)

    文章转载自微信公众号:机器学习炼丹术.欢迎大家关注,这是我的学习分享公众号,100+原创干货. 文章目录: 目录 1 模型构建函数 1.1 add_module 1.2 ModuleList 1.3 ...

  5. string matching(拓展KMP)

    Problem Description String matching is a common type of problem in computer science. One string matc ...

  6. 文本三剑客之sed的用法

    第1章            Sed命令 1.1  sed 命令执行过程 1.2  sed介绍 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(p ...

  7. C# 获取当前月的月初和月末

    /// <summary> /// 获取当前月的月末日期 /// </summary> /// <returns></returns> public s ...

  8. 小程序mpvue中flyio的使用方法

    Fly.js 一个基于Promise的.强大的.支持多种JavaScript运行时的http请求库. 有了它,您可以使用一份http请求代码在浏览器.微信小程序.Weex.Node.React Nat ...

  9. Python学习—Anaconda详细 下载、安装与使用,以及如何创建虚拟环境,不仅仅只有安装步骤哦

    上一期我们介绍了Python.Pycharm.Anaconda三者之间的关系以及使用,这一期主要详细介绍如何在Windows上下载和安装工具Anaconda,然后使用其自带的conda管理不同项目的虚 ...

  10. 20190925-05Redis五大数据类型之String 000 026