[CodeForces - 1272D] Remove One Element 【线性dp】
时间:2019-12-18
本文章向大家介绍[CodeForces - 1272D] Remove One Element 【线性dp】,主要包括[CodeForces - 1272D] Remove One Element 【线性dp】使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
[CodeForces - 1272D] Remove One Element 【线性dp】
标签:题解 codeforces题解
题目描述
Time limit
2000 ms
Memory limit
262144 kB
Source
Codeforces Round #605 (Div. 3)
Tags
brute force dp *1500
Site
https://codeforces.com/problemset/problem/1272/D
题面
Example
Input1
5
1 2 5 3 4
Output1
4
Input2
2
1 2
Output2
2
Input3
7
6 5 4 3 2 4 3
Output3
2
题目大意
给定一个序列\(a[1 \cdots n]\),可以删掉其中的任意一个数(当然也可以选择不删),问这其中最长的连续的严格递增序列的长度是多少?
例如,
给定\(n = 5, \;a[1 \cdots 5] = \text{{1, 2, 5, 3, 4}}\).
如果我们不删除数的话,最长的连续严格递增序列分别为\(\text{{1, 2}}\) 和 \(\text{{3, 4}}\), 长度为2。
如果我们删掉\(a[3] = 5\),最长的连续严格递增序列为\(\text{{1, 2, 3, 4}}\),长度为4。
如果我们删掉其他的数的话,最长的连续严格递增序列长度还是2。
所以最终答案为4,输出4。
解析
天宇给我看这道题的时候就告诉我是一道dp题了,所以一开始就按照dp的思路莽了。
简单的线性dp问题。
- 首先我们考虑不删除数,找到序列内最长连续严格递增序列的长度如何解决。
设\(dp[i][0]\)为到第\(i\)个数为止,且包含第\(i\)个数的连续严格递增序列的长度。
初始化\(dp[1 \cdots n][0] = 1\),因为自己一定是自己所在的严格递增序列的其中的一个元素。
状态转移方程 \[dp[i][0] = dp[i - 1][0] + 1 \,\,(if\;\; a[i] > a[i - 1])\]
- 之后我们加入删除一个数的操作。
想要删除一个数,只有在前两个数比当前这个数小的时候(即 \(a[i] > a[i - 2]\))才有必要。
设\(dp[i][1]\)为到第\(i\)个数为止,且包含第\(i\)个数的,且在其中任意一个位置删除了一个数或没有删除数的连续严格递增序列长度(也可以理解为到这个位置为止包含它自身的最长连续严格递增序列的长度)。
初始化\(dp[i][1] = dp[i][0] = 1\)。
状态转移方程 \[dp[i][1] = \begin{cases} \max{(dp[i][1], dp[i - 1][1] + 1)}, & if \; a[i] > a[i -1]\\[2ex] \max{(dp[i][1], dp[i - 2][0] + 1)}, & if\; a[i] > a[i - 2] \end{cases}\]
想要删除一个数,需要拿之前没有删除过数的状态\(dp[i - 2][0]\)更新,所以我们也要维护\(dp[1 \cdots n][0]\)序列。
当\(a[i] > a[i - 2]\)时,可能会出现没必要删除\(a[i - 1]\)的情况\((a[i] > a[i - 1]> a[i - 2])\),所以要比较一下\(dp[i][1]\)与\(dp[i - 2][0] + 1\)的大小。
- 因为每一个\(dp[i][1]\)是当前\(a[i]\)所在连续严格递增序列的长度,所以想要知道最长的长度,需要最后再扫一遍\(dp[i][1]\)找到最大值。
通过代码
/*
Status
Accepted
Time
46ms
Memory
2364kB
Length
944
Lang
GNU G++11 5.1.0
Submitted
2019-12-18 09:35:42
RemoteRunId
67132818
*/
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 50;
int a[MAXN], dp[MAXN][2];
inline int read() //快读,2e5的输入量,加入快读能明显加快程序运行速度.
{
int res = 0, f = 1;
char ch;
ch = getchar();
while(!isdigit(ch)){
if(ch == '-')
f = -1;
ch = getchar();
}
while(isdigit(ch)){
res = (res << 3) + (res << 1) + ch - 48;
ch = getchar();
}
return f * res;
}
int main()
{
int n;
n = read();
for(int i = 1; i <= n; i ++){ //读入加dp数组的初始化.
a[i] = read();
dp[i][0] = 1;
dp[i][1] = 1;
}
for(int i = 2; i <= n; i ++){ //状态转移.
if(a[i] > a[i - 1]){
dp[i][0] = dp[i - 1][0] + 1;
dp[i][1] = dp[i - 1][1] + 1;
}
if(a[i] > a[i - 2])
dp[i][1] = max(dp[i][1], dp[i - 2][0] + 1);
}
int maxx = 0;
for(int i = 1; i <= n; i ++) //找到最大值.
maxx = max(maxx, dp[i][1]);
printf("%d", maxx);
return 0;
}
原文地址:https://www.cnblogs.com/satchelpp/p/12059245.html
- tomcat 8.5.9.0 解决catalina.out过大的问题
- 物联网是如何驱动网络变革的?——上
- Java常用类(四)之数组工具类Arrays
- java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z 的解决
- JS魔法堂:定义页面的Dispose方法——[before]unload事件启示录
- HashSet/HashMap详解
- Ajax大显身手
- bash编程之xargs实用技巧
- 表单验证和正则表达式
- ELK日志系统:Elasticsearch + Logstash + Kibana 搭建教程
- 兰花协议—让世界自由的互联网
- Git(二)Git几个区的关系与Git和GitHub的关联
- maven/gradle 打包后自动上传到nexus仓库
- bash/shell编程学习(1)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Redis | Redis 哈希相关命令
- 如何访问SAP Spartacus里的config数据
- 工具系列 | HTTP API 身份验证和授权
- Providers in SAP Spartacus
- 详解ELF可执行文件格式:读取头部信息和程序表头
- 我用 Python 写了个基金涨跌通知助手
- 模仿腾讯新闻做了款新闻阅读小程序
- 使用关键点进行小目标检测
- 彻底搞懂 etcd 系列文章(八):etcd 事务 API
- 使用docker搭建一套开发环境全家桶
- TypeScript里的.d.ts语法
- 宋宝华:当Linux内核遭遇鲨鱼—kernelshark
- 基于Pytorch的动态卷积复现
- SAP Spartacus的StorefrontConfig对象
- Linux内核虚拟内存管理之匿名映射缺页异常分析