题面

传送门

Sol

两种情况

第一种就是类似\(***000***000***(0表示选)\),这个可以DP

设\(h[0/1/2/3][i]\)表示到第\(i\)位的状态:

\(0\):表示还没选

\(1\):表示当前在第一段

\(2\):表示选完了第一段

\(3\):表示当前在第二段

第二种就是类似\(000****000***000\),这个也可以DP

设\(f[0/1/2/3][i]\)表示到第\(i\)位的状态:要强制选左边

\(0\):表示目前在第一段

\(1\):表示第一段选完

\(2\):表示目前在第二段

\(3\):表示第二段选完

设\(g[0/1/2/3][i]\)从后往前,强制选右边

\(f和g\)拼起来就好了

# include <bits/stdc++.h>
# define IL inline
# define RG register
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int _(2e5 + 5); IL ll Read(){
RG char c = getchar(); RG ll x = 0, z = 1;
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
} ll n, a[_], f[4][_], g[4][_], ans = -1e18, h[4][_]; int main(RG int argc, RG char* argv[]){
n = Read(); Fill(f, -63); Fill(g, -63); Fill(h, -63);
for(RG int i = 1; i <= n; ++i) a[i] = Read();
f[0][0] = g[0][n + 1] = h[0][0] = 0;
for(RG int i = 1; i <= n; ++i){
f[0][i] = f[0][i - 1] + a[i];
f[1][i] = max(f[0][i], f[1][i - 1]);
f[2][i] = max(f[1][i - 1], f[2][i - 1]) + a[i];
f[3][i] = max(f[2][i], f[3][i - 1]);
h[0][i] = h[0][i - 1];
h[1][i] = max(h[0][i - 1], h[1][i - 1]) + a[i];
h[2][i] = max(h[1][i - 1], h[2][i - 1]);
h[3][i] = max(h[3][i - 1], h[2][i - 1]) + a[i];
ans = max(ans, h[3][i]);
}
for(RG int i = n; i; --i){
g[0][i] = g[0][i + 1] + a[i];
g[1][i] = max(g[0][i], g[1][i + 1]);
g[2][i] = max(g[2][i + 1], g[1][i + 1]) + a[i];
g[3][i] = max(g[2][i], g[3][i + 1]);
}
for(RG int i = 1; i < n; ++i){
ans = max(ans, f[3][i] + g[1][i + 1]);
ans = max(ans, f[1][i] + g[3][i + 1]);
}
printf("%lld\n", ans);
return 0;
}

Luogu1121:环状最大两段子段和的更多相关文章

  1. 洛谷 P1121 环状最大两段子段和 解题报告

    P1121 环状最大两段子段和 题目描述 给出一段环状序列,即认为\(A_1\)和\(A_N\)是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 第一行是一个正整数 ...

  2. P1121 环状最大两段子段和

    P1121 环状最大两段子段和 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的 ...

  3. P1121 环状最大两段子段和(DP)

    P1121 环状最大两段子段和 难度 提高+/省选- 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件 ...

  4. 洛谷P1121 环状最大两段子段和

    题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的第一行是一个正整数N,表示了序列 ...

  5. 【u124】环状最大两段子段和

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. ...

  6. 洛谷 P1121 环状最大两段子段和

    https://www.luogu.org/problemnew/show/P1121 不会做啊... 看题解讲的: 答案的两段可能有两种情况:一是同时包含第1和第n个,2是不同时包含第1和第n个 对 ...

  7. luogu 1121 环状最大两段子段和

    题目大意: 一个序列看做一个环 选两段数使它们和最大 思路: 定义一个dp数组i j 0/1 表示前i个取了连续的j段 0/1表示取不取第i个 但是因为看做一个环 首尾相接的情况可以看做是选三段,其中 ...

  8. luogu P1121 环状最大两段子段和

    嘟嘟嘟 一道说难也难说简单也简单的dp题. 我觉得我的(有篇题解)做法就属于特别简单的. 平时遇到环的问题都是断环为链,但这道题给了一种新的思路. 观察一下,最后的答案无非就这两种:xxx--xx-- ...

  9. 洛谷 P1121 环状最大两段子段和 题解

    每日一题 day57 打卡 Analysis 对于这个问题,由于分成了两个子序列,我们不妨就是枚举一下可能出现的情况: 无非就这两种: 1.+++++0000+++++0000++++ 2.0000+ ...

随机推荐

  1. PyPI使用国内源

    默认的pip源的速度实在无法忍受,于是便搜集了一些国内的pip源,如下: 阿里云 https://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi. ...

  2. mysqldump 备份导出数据排除某张表

    就用 --ignore-table=dbname.tablename参数就行,可以忽略多个. /usr/bin/mysqldump -- -uroot -p123456 dbname --ignore ...

  3. PS图片去色

    快捷键:Ctrl+Shift+U 或者:图像-调整-去色

  4. 开源项目-网上公开http代理爬取、简单分类

    爬取网上公开免费代理(http/socks),解析入库,可满足需要切换IP的场景(爬虫.投票等)需求. 项目地址: https://github.com/Jwnie/proxyservice 1.采用 ...

  5. HTML/CSS 知识点

    整个前端开发的工作流程 产品经理提出项目需求 UI出设计稿 前端人员负责开发静态页面(跟前端同步的后台人员在准备数据) 前后台的交互 测试 产品上线(后期项目维护) 互联网原理 当用户在浏览器输入网址 ...

  6. vue父子组件之间的通信

    利用props在子组件接受父组件传过来的值1.父组件parentComp.vue <template> <childComp :fromParentToChild="fro ...

  7. UVA-714 二分

    把可能的进行二分判断,判断的时候尽量向右取,一直取到不能去为止,这样才有可能成功分割. 判断是否可以把up作为最大值的代码: bool judge(LL up){ if(up < Big) re ...

  8. POJ - 3984 bfs [kuangbin带你飞]专题一

    bfs搜索过程中将路径保存下即可. AC代码 #include<cstdio> #include<cstring> #include<algorithm> #inc ...

  9. datanode启动不起来的各种原因

    一般在数据节点的log日志信息里能找到导致启动不起来的原因. 1.Namenode和Datanode的NamenodeID不一致 描述:一般在集群多次重新格式化HDFS之后,或者刚安装时会碰到.日志信 ...

  10. ul+jquery自定义下拉选择框

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...