子序列

题目链接: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]的更多相关文章

  1. Luogu P1410 子序列

    题目大意: 给定一个长度为\(N\)(\(N\)为偶数)的序列,] 问能否将其划分为两个长度为\(\frac{N}{2}\)的严格递增子序列, 输入一共有\(50\)组数据,每组数据保证\(N \le ...

  2. 【Luogu】P1410子序列(DP)

    题目链接 我DP是真的菜啊啊啊啊啊! f[i][j]表示考虑前i个数,有i-j+1个数组成一个上升子序列,且不以i结尾的尾端最小值. 设a为j个数组成的序列,且以i结尾:b为i-j+1个数组成的序列, ...

  3. 洛谷P1410 子序列

    题目描述 给定一个长度为N(N为偶数)的序列,问能否将其划分为两个长度为N/2的严格递增子序列, 输入输出格式 输入格式: 若干行,每行表示一组数据.对于每组数据,首先输入一个整数N,表示序列的长度. ...

  4. (luogu P1594)护卫队[TPLY]

    (luogu P1594) 护卫队 题目链接 https://www.luogu.org/problemnew/show/P1594 很好的一个模型 题目大意 有一个有序的车队,要求将其分成若干段,每 ...

  5. [Luogu 1410]子序列

    Description 给定一个长度为N(N为偶数)的序列,问能否将其划分为两个长度为N/2的严格递增子序列, Input 若干行,每行表示一组数据.对于每组数据,首先输入一个整数N,表示序列的长度. ...

  6. P1410 子序列 (动态规划)

    题目描述 给定一个长度为N(N为偶数)的序列,问能否将其划分为两个长度为N/2的严格递增子序列. 输入输出格式 输入格式: 若干行,每行表示一组数据.对于每组数据,首先输入一个整数N,表示序列的长度. ...

  7. P1410 子序列

    题目描述 给定一个长度为N(N为偶数)的序列,问能否将其划分为两个长度为N/2的严格递增子序列, 输入输出格式 输入格式: 若干行,每行表示一组数据.对于每组数据,首先输入一个整数N,表示序列的长度. ...

  8. 落谷 P1410 子序列

    题目链接. Discription 给定长度为 \(n\) 的序列 \(A\)(\(n\) 为偶数),判断是否能将其划分为两个长度为 \(\dfrac{N}{2}\) 的严格递增子序列. Soluti ...

  9. 洛谷 P1410 子序列(DP)

    这题的题解的贪心都是错误的...正解应该是个DP 考虑有哪些有关的条件:两个序列的当前长度, 两个序列的末尾数, 把这些都压进状态显然是会GG的 考虑两个长度加起来那一位的数一定是其中一个序列的末尾, ...

随机推荐

  1. 七、Selenium与phantomJS----------动态页面模拟点击、网站模拟登录

    每天一个小实例1(动态页面模拟点击,并爬取你想搜索的职位信息) from selenium import webdriver from bs4 import BeautifulSoup # 调用环境变 ...

  2. Java基础系列--static关键字

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8477914.html 一.概述 static关键字是Java诸多关键字中较常使用的一个,从 ...

  3. 工作笔记--自动切换host的python code

    修改host代码: #coding:utf-8import os,timepwd = os.path.dirname(__file__) #获取当前文件夹的绝对路径pull_host_cmd = 'a ...

  4. STAThread 和 MTAThread

    STAThread:single threaded apartment 直译过来是:单线程单元套间 MTAThread:multiple threaded apartment 直译过来是:多线程单元套 ...

  5. 《设计模式之禅》--MVC框架

    需求:设计一个MVC框架 (以下可能摘要不全,后期整理) 架构图: * 核心控制器:MVC框架入口,负责接收和反馈HTTP请求 * 过滤器:Servlet容器内的过滤器,实现对数据的过滤处理 * 拦截 ...

  6. hihoCoder 1015 KMP算法

    题意:经典字符串匹配算法.给定原串和模式串,求模式串在原串中出现的次数.算法讲解 AC代码 #include <cstdio> #include <cmath> #includ ...

  7. Codeforces103D - Time to Raid Cowavans

    Portal Description 给出长度为\(n(n\leq3\times10^5)\)的序列\(\{a_n\}\),进行\(q(q\leq3\times10^5)\)次询问:给出\(x,y\) ...

  8. Hadoop 错误归档库

    在hive中操作任意mapreduce相关语句 The size of Container logs revealed the below error: 2015-04-24 11:41:41,858 ...

  9. Linux OpenSSH后门的添加与防范

    引言:相对于Windows,Linux操作系统的密码较难获取.不过很多Linux服务器配置了OpenSSH服务,在获取root权限的情况下,可以通过修改或者更新OpenSSH代码等方法,截取并保存其S ...

  10. 高级DirectDraw

    使用高彩模式 上一章中说了可以用16位的色彩深度,但是16位的色彩深度的数据表示模式可以有两种:Alpha.5.5.5(or X.5.5.5) 和 5.6.5(这是16位色彩最常用的).对于使用哪种1 ...