(luogu P1410)子序列 [TPLY]
子序列
题目链接:https://www.luogu.org/problemnew/show/P1410
吐槽:
这道题做得我心累
本来想好好练一练dp
刷刷水题来练练手感
于是乎打开了(普及+/提高)的这道题
然后就。。。
再也不相信洛谷的难度评价了QAQ
题目大意
判断一个长度为2n数列
是否能拆成
两个长度为n的
严格上升的子序列
题解
又是一个神奇的状态QAQ
设f[i][j]表示
到了第i个数,
第1个子序列有j个数
第2个子序列的最大(最靠后)的数为f[i][j]
很怪很怪的啊
然后考虑转移
因为要考虑到一些不合法的转移
所以我们从前往后转
当a[i]<a[i+1]时,
可以把它加到第1个子序列
于是第2个子序列没动
所以f[i+1][j+1]=f[i][j]
当f[i][j]<a[i+1]时
可以把它加到第二个队列
怎么加呢?
转移到f[i+1][j]?
不对呀。
可以考虑把队列1,2颠倒
那么f[i+1][j]就变成了f[i+1][i+1-j]
然后转移即可
代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#define rg register int
#define ll long long
#define RG register
#define il inline
using namespace std;
il int gi()
{
rg x=0,o=0;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||'9'<ch)) ch=getchar();
if(ch=='-') o=1,ch=getchar();
while('0'<=ch&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return o?-x:x;
}
int n,a[2001],f[2001][2001];
// f[i][j]表示 到了第i个,第一个队有j个,第二个队最后面那个数的大小
#define INF 2147483647
#define Getmin(a,b) (a)=(a)>(b)?(b):(a)
#define YES puts("Yes!")
#define NO puts("No!")
int main() {
while(~scanf("%d",&n))
{
if(!n) {puts("No!");continue;}
for(rg i=1;i<=n;++i) a[i]=gi();
for(rg i=1;i<=n;++i)
for(rg j=0;j<=i;++j)
f[i][j]=INF;
f[1][1]=-INF; //把a[1]加到第1个队伍中
for(rg i=1;i<=n;++i)
for(rg j=1;j<=i;++j)
if(f[i][j]!=INF)
{
if(a[i]<a[i+1]) Getmin(f[i+1][j+1],f[i][j]);
if(f[i][j]<a[i+1]) Getmin(f[i+1][i+1-j],a[i]);
}
f[n][n/2]==INF?NO:YES;
}
return 0;
}
(luogu P1410)子序列 [TPLY]的更多相关文章
- Luogu P1410 子序列
题目大意: 给定一个长度为\(N\)(\(N\)为偶数)的序列,] 问能否将其划分为两个长度为\(\frac{N}{2}\)的严格递增子序列, 输入一共有\(50\)组数据,每组数据保证\(N \le ...
- 【Luogu】P1410子序列(DP)
题目链接 我DP是真的菜啊啊啊啊啊! f[i][j]表示考虑前i个数,有i-j+1个数组成一个上升子序列,且不以i结尾的尾端最小值. 设a为j个数组成的序列,且以i结尾:b为i-j+1个数组成的序列, ...
- 洛谷P1410 子序列
题目描述 给定一个长度为N(N为偶数)的序列,问能否将其划分为两个长度为N/2的严格递增子序列, 输入输出格式 输入格式: 若干行,每行表示一组数据.对于每组数据,首先输入一个整数N,表示序列的长度. ...
- (luogu P1594)护卫队[TPLY]
(luogu P1594) 护卫队 题目链接 https://www.luogu.org/problemnew/show/P1594 很好的一个模型 题目大意 有一个有序的车队,要求将其分成若干段,每 ...
- [Luogu 1410]子序列
Description 给定一个长度为N(N为偶数)的序列,问能否将其划分为两个长度为N/2的严格递增子序列, Input 若干行,每行表示一组数据.对于每组数据,首先输入一个整数N,表示序列的长度. ...
- P1410 子序列 (动态规划)
题目描述 给定一个长度为N(N为偶数)的序列,问能否将其划分为两个长度为N/2的严格递增子序列. 输入输出格式 输入格式: 若干行,每行表示一组数据.对于每组数据,首先输入一个整数N,表示序列的长度. ...
- P1410 子序列
题目描述 给定一个长度为N(N为偶数)的序列,问能否将其划分为两个长度为N/2的严格递增子序列, 输入输出格式 输入格式: 若干行,每行表示一组数据.对于每组数据,首先输入一个整数N,表示序列的长度. ...
- 落谷 P1410 子序列
题目链接. Discription 给定长度为 \(n\) 的序列 \(A\)(\(n\) 为偶数),判断是否能将其划分为两个长度为 \(\dfrac{N}{2}\) 的严格递增子序列. Soluti ...
- 洛谷 P1410 子序列(DP)
这题的题解的贪心都是错误的...正解应该是个DP 考虑有哪些有关的条件:两个序列的当前长度, 两个序列的末尾数, 把这些都压进状态显然是会GG的 考虑两个长度加起来那一位的数一定是其中一个序列的末尾, ...
随机推荐
- js作用域的相关知识
众所周知,在ES6之前,JavaScript是没有块级作用域的,如下图所示: 学过其他语言的同学肯定有点诧异,为什么会这样呢?因为js还是不同于其他语言的,在ES5中,只有全局作用域和函数作用域,并没 ...
- ECS的配置与使用
登录阿里云ECS,系统是centos7.2 在linux下通过useradd方式创建新用户,切换到该用户权限,发现-bash-4.2$ . 解决方法:先查看进程,关闭相关进程.然后使用useradd ...
- java 流输出的一些问题
一.java流的控制首先要先准备一个文件,例如:File f = new File(d:/lol.txt); 二.可以使用如下指令创建流,用于不同的用途 1.FileInputStream,FileO ...
- B站标题/子标题/url爬取示例(requests+re)
#coding:utf-8 __author__ = "zhoumi" 3 import requests import re import urllib ''' 本文档目的在于获 ...
- Conemu, Msys2 工具整合,提升windows下控制台工作效率
与windows cmd相比较git-bash这类的console工具好用很多,但是git-bash的命令和功能相对简单,功能扩展起来不方便,git-bash本身也是基于msys的. 昨天发现使用Ms ...
- C/C++语言简介之运算符
比较特别的是,比特右移(>>)运算符可以是算术(左端补最高有效位)或是逻辑(左端补 0)位移.例如,将 11100011 右移 3 比特,算术右移后成为 11111100,逻辑右移则为 0 ...
- html2canvas在微信中无法使用
html2canvas: https://github.com/niklasvh/html2canvas 本来想在微信网页中使用html2canvas生成图片,结果死活不行 测试发现在Chrome,手 ...
- js中的isNaN()函数
<html> <head> <script type="text/javascript" src="function.js"> ...
- POJ - 3279 枚举 [kuangbin带你飞]专题一
这题很经典啊,以前也遇到过类似的题--计蒜客 硬币翻转. 不过这题不仅要求翻转次数最少,且翻转方案的字典序也要最小. 解法:二进制枚举第一行的翻转方案,然后处理第二行,如果第二行的k列的上一列是黑色, ...
- 使用SpringSecurity保护你的Eureka.
因为注册中心基本上都是自己的应用在使用,应用不是特别多,可以写死,如果应用很多,那么就写入数据库把 pom <dependency> <groupId>org.springfr ...