Luogu1121:环状最大两段子段和
题面
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:环状最大两段子段和的更多相关文章
- 洛谷 P1121 环状最大两段子段和 解题报告
P1121 环状最大两段子段和 题目描述 给出一段环状序列,即认为\(A_1\)和\(A_N\)是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 第一行是一个正整数 ...
- P1121 环状最大两段子段和
P1121 环状最大两段子段和 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的 ...
- P1121 环状最大两段子段和(DP)
P1121 环状最大两段子段和 难度 提高+/省选- 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件 ...
- 洛谷P1121 环状最大两段子段和
题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的第一行是一个正整数N,表示了序列 ...
- 【u124】环状最大两段子段和
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. ...
- 洛谷 P1121 环状最大两段子段和
https://www.luogu.org/problemnew/show/P1121 不会做啊... 看题解讲的: 答案的两段可能有两种情况:一是同时包含第1和第n个,2是不同时包含第1和第n个 对 ...
- luogu 1121 环状最大两段子段和
题目大意: 一个序列看做一个环 选两段数使它们和最大 思路: 定义一个dp数组i j 0/1 表示前i个取了连续的j段 0/1表示取不取第i个 但是因为看做一个环 首尾相接的情况可以看做是选三段,其中 ...
- luogu P1121 环状最大两段子段和
嘟嘟嘟 一道说难也难说简单也简单的dp题. 我觉得我的(有篇题解)做法就属于特别简单的. 平时遇到环的问题都是断环为链,但这道题给了一种新的思路. 观察一下,最后的答案无非就这两种:xxx--xx-- ...
- 洛谷 P1121 环状最大两段子段和 题解
每日一题 day57 打卡 Analysis 对于这个问题,由于分成了两个子序列,我们不妨就是枚举一下可能出现的情况: 无非就这两种: 1.+++++0000+++++0000++++ 2.0000+ ...
随机推荐
- Linux系统Go开发环境搭建
Go 语言是由谷歌的科学家开发的,并开源的新语言,被誉为"21世纪的C语言",它的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程变得 ...
- 解决java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.ArrayList这个问题
今天使用SSM框架,用@ResponseBody注解,出现了这个问题 java.lang.IllegalArgumentException: No converter found for return ...
- Mybatis学习之道(一)
本例子为采用的mysql+maven+mybatis构建. 初步学习mybatis: mybatis为一个半自动框架,相对于hibernate来说他更加轻巧,学习成本更低. 1.新建一个maven工程 ...
- DxPackNet 4.保存音视频为本地avi文件
捕获到了音视频后要保存到本地文件,这是很常见的应用场景,DxPackNet保存视频文件也比较简单 用 IAviStreamWriter avi文件写入流即可 1.初始化相关设备,设定好数据捕获的回调 ...
- CNN 卷积层输入Map大小计算
对于输出的size计算: out_height=((input_height - filter_height + padding_top+padding_bottom)/stride_height ) ...
- qt pro 设置编译参数,支持 xp
#兼容 XP VS2015 5.01 版本 win32 { QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01 QMAKE_LFLAGS_CONSOLE = ...
- Python 关于super 的 用法和原理(挖坑)
一.前言 Python 面向对象中有继承这个概念,初学时感觉很牛逼,里面也有个super类,经常见到,最近做一些题才算是理解了.特地记录分享给后来研究的小伙伴,毕竟现在小学生都开始学了(滑稽脸) 二. ...
- KV型内存数据库Redis
Redis是开源的高性能内存Key-Value数据库, 可以提供事务和持久化支持, 并提供了TTL(time to life)服务. Redis采用单线程数据操作+非阻塞IO的模型,非阻塞IO提供了较 ...
- 使用SpringSecurity保护你的Eureka.
因为注册中心基本上都是自己的应用在使用,应用不是特别多,可以写死,如果应用很多,那么就写入数据库把 pom <dependency> <groupId>org.springfr ...
- Java中子类能继承父类的私有属性吗?
前段时间去听老师讲课的时候,老师告诉我子类是可以继承父类所有的属性和方法的.当时我是极其疑惑的,因为之前学校考试时这个考点我记得很清楚:子类只能继承父类的非私有属性和方法.老师给我的解释是这样的--先 ...