不难发现本题贪心是不好做的,可以考虑 \(dp\)。

首先的一个想法就是令 \(dp_{i, j, k, l}\) 表示当前选到第 \(i\) 个位置,当前第一个序列选了 \(j\) 个数,当前第一个序列最后一个元素为 \(k\),第二个序列最后一个元素为 \(l\) 是否合法。这样的话转移十分显然,但复杂度过高了。进一步我们可以发现 \(k, l\) 中一定有一个是 \(a_i\),于是我们可以令 \(dp_{i, j, k, 0 / 1}\) 表示当前选到第 \(i\) 个位置,当前第一个序列选了 \(j\) 个数,选择 \(a_i\) 为结尾的另一个序列的结尾为 \(k\),\(i\) 是第一个序列还是第二个序列选择是否合法。这样的转移也很显然,不再赘述。

下面这个操作就非常骚了,我们可以发现我们 \(dp\) 的值都是 \(0 / 1\),这样感觉非常的亏,我们能不能将状态中的某一维设计到 \(dp\) 值中去呢?答案是可以的,我们令 \(dp_{i, j, 0 / 1}\) 表示当前选到第 \(i\) 个位置,第一个序列选了 \(j\) 个数,\(a_i\) 是第一个还是第二个序列选时另一个序列结尾元素的最小值。那么我们就有转移:

\(dp_{i, j, 0} = \min\{dp_{i, j, 0}, dp_{i - 1, j - 1, 0}\}(a_i > a_{i - 1})\)

\(dp_{i, j, 0} = \min\{dp_{i, j, 0}, a_{i - 1}\}(a_i > dp_{i - 1, j - 1, 1})\)

\(dp_{i, j, 1} = \min\{dp_{i, j, 1}, dp_{i - 1, j, 1}\}(a_i > a_{i - 1})\)

\(dp_{i, j, 1} = \min\{dp_{i, j, 1}, a_{i - 1}\}(a_i > dp_{i - 1, j, 0})\)

最终只需判断 \(dp_{n, \frac{n}{2}, 0 / 1} \ne \infty\) 即可。

#include<bits/stdc++.h>
using namespace std;
#define N 2000 + 5
#define inf 1000000000
#define rep(i, l, r) for(int i = l; i <= r; ++i)
int T, n, a[N], dp[N][N][2];
int read(){
char c; int x = 0, f = 1;
c = getchar();
while(c > '9' || c < '0'){ if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int main(){
T = read();
while(T--){
n = read();
rep(i, 1, n) a[i] = read();
rep(i, 1, n) rep(j, 0, min(i, n / 2)) dp[i][j][0] = dp[i][j][1] = inf;
dp[1][1][0] = dp[1][0][1] = -1;
rep(i, 2, n) rep(j, 0, min(i, n / 2)){
if(a[i] > a[i - 1] && j >= 1) dp[i][j][0] = dp[i - 1][j - 1][0];
if(j >= 1 && a[i] > dp[i - 1][j - 1][1]) dp[i][j][0] = min(dp[i][j][0], a[i - 1]);
if(a[i] > a[i - 1]) dp[i][j][1] = dp[i - 1][j][1];
if(a[i] > dp[i - 1][j][0]) dp[i][j][1] = min(dp[i][j][1], a[i - 1]);
}
if(dp[n][n / 2][0] != inf || dp[n][n / 2][1] != inf) puts("Yes!");
else puts("No!");
}
return 0;
}

[HNOI2009]双递增序列的更多相关文章

  1. 【BZOJ1489】[HNOI2009]双递增序列(动态规划)

    [BZOJ1489][HNOI2009]双递增序列(动态规划) 题面 BZOJ 洛谷 题解 这\(dp\)奇奇怪怪的,设\(f[i][j]\)表示前\(i\)个数中,第一个数列选了\(j\)个数,第二 ...

  2. [luogu4728 HNOI2009] 双递增序列 (dp)

    传送门 Solution 前几天刚做了类似题,这种将一个序列拆分为两个单调序列的题一般都是设\(dp[i]\)表示i为一个单调序列的末尾时,另一个序列的末尾是多少 然后应用贪心的思想,在这道题中就是让 ...

  3. [HNOI2009]双递增序列(动态规划,序列dp)

    感觉这个题还蛮难想的. 首先状态特别难想.设\(dp[i][j]\)表示前i个数,2序列的长度为j的情况下,2序列的最后一个数的最小值. 其中1序列为上一个数所在的序列,2序列为另外一个序列. 这样设 ...

  4. P4728 [HNOI2009]双递增序列

    题意 这个DP状态有点神. 首先考虑一个最暴力的状态:\(f_{i,j,k,u}\)表示第一个选了\(i\)个,第二个选了\(j\)个,第一个结尾为\(k\),第二个结尾为\(u\)是否可行. 现在考 ...

  5. [HNOI2009]双递增序列(洛谷P4728)+小烈送菜(内部训练题)——奇妙的dp

    博主学习本题的经过嘤嘤嘤: 7.22 : 听学长讲(一知半解)--自己推(推不出来)--网上看题解--以为自己会了(网上题解是错的)--发现错误以后又自己推(没推出来)--给学长发邮件--得到正确解法 ...

  6. luogu4728 双递增序列 (dp)

    设f[i][j]表示以i位置为第一个序列的结尾,第一个序列的长度为j,第二个序列的结尾的最小值 那么对于f[i][j],有转移$f[i+1][j+1]=min\{f[i+1][j+1],f[i][j] ...

  7. BZOJ 1489: [HNOI2009]双递增序( dp )

    dp(i, j)表示选第i个, 且当前序列长度为j, 另一个序列的最后一个元素的最小值...然后根据上一个是哪个序列选的讨论一下就行了...奇怪的dp... --------------------- ...

  8. [BZOJ 1489][HNOI2009]双递增序

    传送门 满满的负罪感,昨晚的刷题历程:写几道难题吧-->算了,还是只切道水题吧-->RNG赢了...... 背包一下就行了 #include <bits/stdc++.h> u ...

  9. ACM: Racing Gems - 最长递增序列

    Racing Gems   You are playing a racing game.  Your character starts at the x axis (y = 0) and procee ...

随机推荐

  1. 用户线程&&守护线程

         守护线程是为用户线程服务的,当一个程序中的所有用户线程都执行完成之后程序就会结束运行,程序结束运行时不会管守护线程是否正在运行,由此我们可以看出守护线程在 Java 体系中权重是比较低的.当 ...

  2. SNGAN

    目录 概 主要内容 Miyato T., Kataoka T., Koyama M & Yoshida Y. SPECTRAL NORMALIZATION FOR GENERATIVE ADV ...

  3. Spring企业级程序设计 • 【第7章 Spring框架整合】

    全部章节   >>>> 本章目录 7.1 模型数据解析及控制器返回值 7.1.1 SSM框架环境搭建 7.1.1 ModelAndView多种用法 7.1.2 整合MyBati ...

  4. 编写Java程序,使用ThreadLocal类,项目中创建账户类 Account,类中包括账户名称name、 ThreadLocal 类的引用变量amount,表示存款

    查看本章节 查看作业目录 需求说明: 某用户共有两张银行卡,账户名称相同,但卡号和余额不同.模拟用户使用这两张银行卡进行消费的过程,并打印出消费明细 实现思路: 项目中创建账户类 Account,类中 ...

  5. 使用.NET 6开发TodoList应用(17)——实现数据塑形

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在查询的场景中,还有一类需求不是很常见,就是在前端请求中指定返回的字段,所以关于搜索的最后一个主题我们就来演示一下关于数据塑形 ...

  6. Linux 使用 split 命令分割文件

    使用方法: $ split --help 用法:split [选项]... [输入 [前缀]] 将输入内容拆分为固定大小的片段并输出到"前缀aa"."前缀ab" ...

  7. Chrome - XPath Helper插件 使用手工拖拽方式无法正常安装的解决办法

    安装前准备: (1)下载 XPath Helper资源: 链接: https://pan.baidu.com/s/1yEnngIJz8fT9fNv3aHhs7w 提取码: afy3 (2)Chrome ...

  8. Cannot uninstall 'pyparsing'. It is a distutils installed project

    我的环境: [root@ansible ~]# python -V Python 2.7.5 [root@ansible ~]# cat /etc/redhat-release CentOS Linu ...

  9. Tomcat8/9的catalina.out中文乱码问题解决

    OS: Red Hat Enterprise Linux Server release 7.8 (Maipo) Tomcat: 9 中文显示为???问号 在$CATALINA_HOME/conf下的l ...

  10. Nginx日志通过Flume导入到HDFS中

    关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新) flume上传到hdfs: 当我们的数据量比较大时,比如每天的日志文件达到5G以上 使用ha ...