[Luogu 1410]子序列
Description
给定一个长度为N(N为偶数)的序列,问能否将其划分为两个长度为N/2的严格递增子序列,
Input
若干行,每行表示一组数据。对于每组数据,首先输入一个整数N,表示序列的长度。之后N个整数表示这个序列。
Output
同输入行数。对于每组数据,如果存在一种划分,则输出“Yes!”,否则输出“No!“。
Sample Input
- 6 3 1 4 5 8 7
- 6 3 2 1 6 5 4
Sample Output
- Yes!
- No!
HINT
共三组数据,每组数据行数<=50,0 <= 输入的所有数 <= 10^9
第一组(30%):N <= 20
第二组(30%):N <= 100
第三组(40%):N <= 2000
题解
在前$i$位中找长$j$位的以第$i$位结尾的上升子序列(我们设这个为序列$A$),并且剩下的也是上升子序列(设这个为序列$B$),那么$f[i][j]$表示剩下的(即前i位中长$i-j$位的不以第$i$位结尾的)上升子序列(即序列$B$)的最后一位的最小值。
注意:$A$一定是以最后一个数结尾的。
然后转移:
如果$a[i]<a[i+1]$,那么$f[i+1][j+1] = min(f[i+1][j+1], f[i][j])$,意思就是将$a[i+1]$接在序列$A$后,相当于可以直接把$f[i][j]$扩展到第$i+1$位。
如果$f[i][j]<a[i+1]$,那么$f[i+1][i-j+1] = min(f[i+1][i-j+1], a[i])$,意思是将$a[i+1]$接在$B$后,相当于第$i+1$继承前$i$位中$i-j$位长的上升子序列,此时$B$序列的某尾为最后一个数,那么我们就要$swap(A,B)$。
- //It is made by Awson on 2017.9.27
- #include <set>
- #include <map>
- #include <cmath>
- #include <ctime>
- #include <queue>
- #include <stack>
- #include <string>
- #include <cstdio>
- #include <vector>
- #include <cstdlib>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- #define Min(a, b) ((a) < (b) ? (a) : (b))
- #define Max(a, b) ((a) > (b) ? (a) : (b))
- #define LL long long
- using namespace std;
- const int N = ;
- void read(int &x) {
- char ch; bool flag = ;
- for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || ); ch = getchar());
- for (x = ; isdigit(ch); x = (x<<)+(x<<)+ch-, ch = getchar());
- x *= -*flag;
- }
- int n, a[N+];
- int f[N+][N+];
- void work() {
- for (int i = ; i <= n; i++)
- read(a[i]);
- memset(f, , sizeof(f));
- int INF = f[][];
- f[][] = -;
- for (int i = ; i <= n; i++)
- for (int j = ; j <= i; j++)
- if (f[i][j] != INF) {
- if (a[i] < a[i+]) f[i+][j+] = Min(f[i+][j+], f[i][j]);
- if (f[i][j] < a[i+]) f[i+][i+-j] = Min(f[i+][i+-j], a[i]);
- }
- printf(f[n][n/] == INF ? "No!\n" : "Yes!\n");
- }
- int main() {
- while (~scanf("%d", &n))
- work();
- return ;
- }
[Luogu 1410]子序列的更多相关文章
- (luogu P1410)子序列 [TPLY]
子序列 题目链接:https://www.luogu.org/problemnew/show/P1410 吐槽: 这道题做得我心累 本来想好好练一练dp 刷刷水题来练练手感 于是乎打开了(普及+/提高 ...
- Luogu P1410 子序列
题目大意: 给定一个长度为\(N\)(\(N\)为偶数)的序列,] 问能否将其划分为两个长度为\(\frac{N}{2}\)的严格递增子序列, 输入一共有\(50\)组数据,每组数据保证\(N \le ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- Luogu 3402 最长公共子序列(二分,最长递增子序列)
Luogu 3402 最长公共子序列(二分,最长递增子序列) Description 经过长时间的摸索和练习,DJL终于学会了怎么求LCS.Johann感觉DJL孺子可教,就给他布置了一个课后作业: ...
- Luogu 2766 - 最长不下降子序列问题 - [LIS问题][DP+网络流]
题目链接:https://www.luogu.org/problemnew/show/P2766 题解(大量参考https://blog.csdn.net/ZscDst/article/details ...
- Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流)
Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流) Description 问题描述: 给定正整数序列x1,...,xn . (1 ...
- luogu P2757 [国家集训队]等差子序列
题目链接 luogu P2757 [国家集训队]等差子序列 题解 线段树好题 我选择暴力 代码 // luogu-judger-enable-o2 #include<cstdio> inl ...
- Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列)
Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列) Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺 ...
- 【luogu P1637 三元上升子序列】 题解
题目链接:https://www.luogu.org/problemnew/show/P1637 BIT + 离散化. 读题得数据规模需离散化.BIT开不到longint这么大的数组. 对于题目所求的 ...
随机推荐
- 使用.NET开发AutoCAD——C#/AutoCAD 2018/ObjectArx/二次开发入门(二)
1.开发环境配置: (1)安装AutoCAD2018: (2)安装VS2015: (3)安装ObjectARX 2018类库: (4)安装ObjectARX 2018 .NET开发向导(ObjectA ...
- Java基础学习笔记六 Java基础语法之类和ArrayList
引用数据类型 引用数据类型分类,提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类.我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner ...
- X-pack安装
1. Install X-Pack into Elasticsearch docker exec -it anyrobot-store /bin/bash bin/elasticsearch- ...
- IT & ME
第一部分:结缘计算机 填报志愿的那天晚上,老爸老妈和我一起在房间里讨论专业选择的事情.因为我性格比较内敛,家人建议我去学医.而我又对学医一点也不感冒,再加上自己高中时期一直喜欢玩游戏,于是最后就填报了 ...
- java实现找一个数范围内所有的一
一.题目内容 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数.要求:写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12) = 5. ...
- 201621123031 《Java程序设计》第2周学习总结
Week02-Java基本语法与类库 1. 本周学习总结 本周讲了Java的基本数据类型,主要分为八类(byte,short,int,long,double,float,char,boolean),其 ...
- linux系统命令学习系列-用户组管理
先复习一下上节内容: 设置密码命令passwd 用户信息修改命令usermod 用户删除命令userdel 作业:修改user1的用户id为505,家目录到admin,用户组为admin,最后删除us ...
- Python 列表嵌套多种实现方式
#coding=utf-8 list=[] for i in range(1,101): list.append(i) # print(list) tempList=[] newList=[] whi ...
- 关于APIcloud对应C#的 wcf框架作为后台,实现多库功能
首先,我是使用ajax原来的请求方式,并没有使用apicloud中封装的请求方式. 前端代码: function makeRequest() { //alert("inside makeRe ...
- Mego开发文档 - 索引
Mego 开发文档 Mego 快速概述 主要特性 获取Mego 使用流程 模型 查询 保存数据 入门 Mego 快速开始 创建项目 安装Nuget包 创建连接字符串 创建模型及数据上下文(添加引用) ...