Codeforces 1272D
题意:给定一个长度为n的数组a,你至多可以删去其中的一个元素,找出最长的连续(严格)上升子序列的长度。
分析:读完题之后可以发现这道题和模板:连续上升子序列很相像,首先可以确定方向是dp:状态是当前的位置,目标是连续(严格)上升子序列的长度,即dp[i]表示以a[i]为结尾的最长的连续(严格)上升子序列的长度。但是,这道题不同于模板的地方就在于题目中给定了一个条件:至多可以删去其中的一个元素,乍一看似乎很难再做状态转移,但是不妨将删去这件事本身也引入状态转移中来。
不难想到“已经删去一个元素”的状态一定是由“没有删去元素”的状态转移过来的,我们可以使用dp第二维来表示是否已经删去了一个元素,即dp[i][0]表示在没有删去一个元素的前提下以a[i]为结尾的最长(严格)连续上升子序列的最长长度,而dp[i][1]则是以已经山区了一个元素为前提下的最长长度。想到这里,便可以开始推状态转移方程:
首先第一步,先不考虑删去元素的状态转移,dp[i][0]这个状态一定是由dp[i-1][0]转移而来的,即如果a[i] > a[i-1],则dp[i][0] = dp[i-1][0]+1;如果第二维=1,同样也不难想到,在这种情况下也是直接由dp[i-1][1]+1转移而来即可。
当a[i] > a[i-1]时,dp[i][0 or 1] = max(dp[i][0],dp[i-1][0 or 1]+1);
第二步:考虑删去元素的情况。倘若我们现在想要得到dp[i],考虑删去a[i-1],这样删去的时候,在从左到右的递推过程中就可以把所有的情况都覆盖到,而不会漏解或重复运算,并且删去a[i-1]使得dp[i]变化的条件是a[i] > a[i-2],也就是当前这一位数比它之前的之前一位数还要大时,删去它之前的数,可能会导致它的最长长度有所变化,其中就可能导致最大长度变大,因此,当a[i] > a[i-2]时,有:dp[i][1] 由 dp[i-2][0] + 1 转移而来。
当a[i] > a[i-2]时,dp[i][1] = max(dp[i][1],dp[i-2][0]+1);
那么综合前两步,不难得出状态转移方程,递推完方程之后,每一步更新结果即可。
代码:
#include <iostream>
#include <algorithm> using namespace std;
const int N = 200005;
int dp[N][2],a[N];
int main()
{
int n;cin >> n;
for(int i = 1;i <= n;++i)
cin >> a[i];
dp[1][0] = 1;
int res = -1;
for(int i = 2;i <= n;++i)
{
dp[i][0] = 1;dp[i][1] = 1;
if(a[i] > a[i-1])
{
dp[i][0] = max(dp[i-1][0] + 1,dp[i][0]);
dp[i][1] = max(dp[i-1][1] + 1,dp[i][1]);
}
if(a[i] > a[i-2])
dp[i][1] = max(dp[i-2][0] + 1,dp[i][1]);
res = max(res,max(dp[i][0],dp[i][1]));
}
cout << res;
return 0;
}
Codeforces 1272D的更多相关文章
- [CodeForces - 1272D] Remove One Element 【线性dp】
[CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
随机推荐
- 【HANA系列】SAP HANA的ini文件存储路径
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA的ini文件存储 ...
- HCL试验3
PC端配置:配置ip地址 配置网关 交换机(左)配置:①创建VLAN system-view vlan 10 vlan 20 ②配置PC端接口 interface gi 1/0/1 port link ...
- centos v7.0配置sftp
需求: 1.建立三个sftp帐号,admin,test1,test22.三个帐号分别在/home/sftp下拥有相应的目录3.test1和test2只能进入自己的目录,admin可以进入三个目录(ch ...
- Shell 变量详解教程之位置变量与预定义变量
Shell 变量分为3部分,分别是用户自定义变量.位置变量和预定义变量. 一. 自定义变量 那么,什么是变量呢?简单的说,就是让某一个特定字符串代表不固定的内容,用户定义的变量是最普通的Shell ...
- [转帖]Ubuntu 对应内核版本
带有相应Linux内核版本的Ubuntu版本列表 https://www.helplib.com/ubuntu/article_155943 问题: 是否有带有默认对应的Linux内核版本的Ubu ...
- Flink初探-为什么选择Flink
本文主要记录一些关于Flink与storm,spark的区别, 优势, 劣势, 以及为什么这么多公司都转向Flink. What Is Flink 一个通俗易懂的概念: Apache Flink 是近 ...
- Java 读取application.properties配置文件中配置
实际开发中若需要读取配置文件application.properties中的配置,代码如下.例:读取配置文件中name属性配置值: 代码如下: import org.springframework.c ...
- AtCoder Beginner Contest 077
A - Rotation Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement You are g ...
- VeryNginx中文文档
VeryNginx VeryNginx 是一个功能强大而对人类友好的 Nginx 扩展程序. 提示 v0.2` 版本之后,控制台入口被移动到了 `/verynginx/index.html 中文控制台 ...
- JS作用域及域解析规则
1.JS作用域:变量和函数作用的范围. 2.JS解析器可以分为域解析和逐行解读代码两个过程. 域解析:1.当进行域解析的时候,一旦找到var,就会提取后面的变量名,并给它赋值给undefined. 2 ...