[HNOI2009]双递增序列
不难发现本题贪心是不好做的,可以考虑 \(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]双递增序列的更多相关文章
- 【BZOJ1489】[HNOI2009]双递增序列(动态规划)
[BZOJ1489][HNOI2009]双递增序列(动态规划) 题面 BZOJ 洛谷 题解 这\(dp\)奇奇怪怪的,设\(f[i][j]\)表示前\(i\)个数中,第一个数列选了\(j\)个数,第二 ...
- [luogu4728 HNOI2009] 双递增序列 (dp)
传送门 Solution 前几天刚做了类似题,这种将一个序列拆分为两个单调序列的题一般都是设\(dp[i]\)表示i为一个单调序列的末尾时,另一个序列的末尾是多少 然后应用贪心的思想,在这道题中就是让 ...
- [HNOI2009]双递增序列(动态规划,序列dp)
感觉这个题还蛮难想的. 首先状态特别难想.设\(dp[i][j]\)表示前i个数,2序列的长度为j的情况下,2序列的最后一个数的最小值. 其中1序列为上一个数所在的序列,2序列为另外一个序列. 这样设 ...
- P4728 [HNOI2009]双递增序列
题意 这个DP状态有点神. 首先考虑一个最暴力的状态:\(f_{i,j,k,u}\)表示第一个选了\(i\)个,第二个选了\(j\)个,第一个结尾为\(k\),第二个结尾为\(u\)是否可行. 现在考 ...
- [HNOI2009]双递增序列(洛谷P4728)+小烈送菜(内部训练题)——奇妙的dp
博主学习本题的经过嘤嘤嘤: 7.22 : 听学长讲(一知半解)--自己推(推不出来)--网上看题解--以为自己会了(网上题解是错的)--发现错误以后又自己推(没推出来)--给学长发邮件--得到正确解法 ...
- luogu4728 双递增序列 (dp)
设f[i][j]表示以i位置为第一个序列的结尾,第一个序列的长度为j,第二个序列的结尾的最小值 那么对于f[i][j],有转移$f[i+1][j+1]=min\{f[i+1][j+1],f[i][j] ...
- BZOJ 1489: [HNOI2009]双递增序( dp )
dp(i, j)表示选第i个, 且当前序列长度为j, 另一个序列的最后一个元素的最小值...然后根据上一个是哪个序列选的讨论一下就行了...奇怪的dp... --------------------- ...
- [BZOJ 1489][HNOI2009]双递增序
传送门 满满的负罪感,昨晚的刷题历程:写几道难题吧-->算了,还是只切道水题吧-->RNG赢了...... 背包一下就行了 #include <bits/stdc++.h> u ...
- ACM: Racing Gems - 最长递增序列
Racing Gems You are playing a racing game. Your character starts at the x axis (y = 0) and procee ...
随机推荐
- MCMC using Hamiltonian dynamics
目录 算法 符号说明 Hamilton方程 物理解释 一些性质 可逆 Reversibility H的不变性 保体积 Volume preservation 辛 Symplecticness 离散化H ...
- iOS提交AppStore审核时:提示有其他支付并隐藏功能被拒的处理办法
背景提示:数字类产品(比如购买会员等不需要配送实物的商品),Apple规定必须使用苹果IAP应用内支付,给Apple分成30%.打包的时候不要勾选微信或支付宝等其他支付方式.如果你提交的包里包含了微信 ...
- [C]郝斌C语言课程大纲及笔记
本笔记整理于郝斌老师C语言课程,做学习参考之用. 1.[编程笔记]第一章 C语言概述 2.[编程笔记]第二章 C语言预备知识 3.[编程笔记]第三章 运算符与表达式 4.[编程笔记]第四章 流程控制 ...
- 【微信小程序云开发】1分钟学会实现上传、下载、预览、删除图片,并且以九宫格展示图片
大家好,我叫小秃僧 这篇文章是讲解云开发如何上传.下载.预览.删除图片,并且以九宫格展示图片的功能 @ 目录 1. 实现效果 2.JavaScript代码 3.wxml代码 4.wxss代码 1. 实 ...
- Webpack有哪些常见的Loader?他们是解决什么问题的?
先来了解一下Loader,webpack是属于模块化方案,他能让任意类型的文件都能运行在浏览器中,怎么做到呢?这时就有了loader 定义: loader 用于对模块的源代码进行转换.loader 可 ...
- TKE 用户故事 | 作业帮 Kubernetes 原生调度器优化实践
作者 吕亚霖,2019年加入作业帮,作业帮架构研发负责人,在作业帮期间主导了云原生架构演进.推动实施容器化改造.服务治理.GO微服务框架.DevOps的落地实践. 简介 调度系统的本质是为计算服务/任 ...
- centos6.5-搭建Apache-地址限制和用户访问
对于企业内部的WEB管理平台,例如日志分析系统(Awstats)为了更好实现访问控制,在通过客户端访问时,提交一些用户密码或对客户IP地址进行授权,避免服务器的安全隐患. 常见的访问控制方式:应用于配 ...
- 使用.NET 6开发TodoList应用(21)——实现API版本控制
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 API接口版本管理,对于一些规模稍大的企业应用来说,是经常需要关注的一大需求.尽管我们的示例程序TodoList很简单,但是我 ...
- Git_添加、删除远端仓库中的文件
一.将文件添加到远端仓库 1.新增文件 2.使用git add 将文件添加到本地缓存中 3.使用git commit 将文件添加到本地仓库中 4.使用git push 将本地仓库中的修改同步到远端仓库 ...
- 第10组 Beta冲刺 总结
1.基本情况 组长博客链接:https://www.cnblogs.com/cpandbb/p/14050808.html 答辩总结: ·因为alpha阶段的产品做得偏离了方向,所以beta冲刺大家非 ...