(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的 考虑两个长度加起来那一位的数一定是其中一个序列的末尾, ...
随机推荐
- Phalcon调试大杀器之phalcon-debugbar安装
Phalcon 是一款非常火的高性能C扩展php开发框架.特点是高性能低耦合,但遗憾的是长期缺少一款得力的调试辅助工具. 目前版本主要以Laravel debugbar的具有功能为蓝本开发,并针对ph ...
- iOS 9 HTTPS 的配置
方法有两种: (1)废话少说直接上图: (2)右击info.plist 文件 open as ->source code 在里面注入如下代码就行了(位置不固定,但要在指定的文件夹选项里) < ...
- yum安装man命令程序错误
第一次安装CentOS后,man命令无法使用,查了一下,发现没有安装man命令程序.尝试安装man yum install man 结果如下: Loaded plugins: fastestmirro ...
- IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理
1.前言 一个安全的信息系统,合法身份检查是必须环节.尤其IM这种以“人”为中心的社交体系,身份认证更是必不可少. 一些PC时代小型IM系统中,身份认证可能直接做到长连接中(也就是整个IM系统都是以长 ...
- Date 类
一.Date类型的初始化 1. Date(int year, int month, int date); 直接写入年份是得不到正确的结果的. 因为java中Date是从1900年开始算的,所以前面的第 ...
- 如何使用 VS生成动态库?
如何使用 VS生成动态库? //.cpp 文件默认定义了 __cplusplus 宏 #ifdef __cplusplus extern "C"{ #endif xxx #ifde ...
- Ubuntu版本更替所引发的“血案”
Ubuntu版本更替所引发的"血案" 今天,我兴致很高的装了双系统,并且配置了Linux的网络,接下来就是安装一些软件,来实现我想达到的功能了,结果被一个小小的命令卡的 ...
- django框架 - 实时查看执行的sql语句
django框架采用的ORM模型,我们可以通过mysql的日志记录实时看到执行的sql语句,具体步骤如下: 第一步:找到mysql的配置文件 第二步:编辑mysql配置文件 第三步:重启mysql 第 ...
- Bind、Apply、Call三者的区别
1)bind与apply.call 的最大区别就是:bind不会立即调用,其他两个会立即调用 var fn = { _int: function(){return 3}, fun: function( ...
- Extjs 4.0 Tab页
1.JSON代码 Ext.MyTabs=Ext.extend(Ext.TabPanel ,{ xtype:"tabpanel", activeTab:2, width:694, h ...