Luogu P1410 子序列
题目大意:
给定一个长度为\(N\)(\(N\)为偶数)的序列,]
问能否将其划分为两个长度为\(\frac{N}{2}\)的严格递增子序列,
输入一共有\(50\)组数据,每组数据保证\(N \leq 2*10^3\)
题目解法:
非常巧妙的一道\(DP\)题。
$f[i][j] $ 表示到了第\(i\)个位置,
第一个序列中有\(j\)个元素,第二个序列中最后一个元素大小为\(f[i][j]\)。
显然最小化\(f[i][j]\)是最优策略。
然后转移有两种:
( 1 )如果\(h[i]<h[i+1]\),那么\(i+1\)可以放入第一个序列:
\[f[i+1][j+1] = min(f[i+1][j+1]\ , \ f[i][j])\]
( 2 )如果\(f[i][j]<h[i+1]\),那么\(i+1\)可以放入第二个序列:
\[f[i+1][i-j+1] = min(f[i+1][i-j+1],h[i])\]
其实就是交换了第一个序列与第二个序列。
实现代码:
#include<bits/stdc++.h>
#define RG register
#define IL inline
#define _ 2005
#define INF 2147483640
using namespace std;
IL int gi(){
RG int data = 0 , m = 1; RG char ch = 0;
while(ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
if(ch == '-'){m = 0; ch = getchar();}
while(ch >= '0' && ch <= '9')
{data = (data << 1) + (data << 3) + (ch ^ 48); ch = getchar(); }
return ( m ) ? data : -data;
}
int f[_][_] , h[_] , n;
int main(){
while(scanf("%d",&n) != EOF){
for(RG int i = 1; i <= n; i ++)h[i] = gi();
for(RG int i = 1; i <= n; i ++)
for(RG int j = 0; j <= i; j ++)
f[i][j] = INF;
f[1][1] = -INF;
for(RG int i = 1; i <= n; i ++)
for(RG int j = 1; j <= i; j ++)
if(f[i][j] != INF){
if(h[i] < h[i+1])
f[i+1][j+1] = min(f[i][j] , f[i+1][j+1]);
if(f[i][j] < h[i+1])
f[i+1][i-j+1] = min(f[i+1][i-j+1] , h[i]);
}
puts( (f[n][n/2]!=INF) ? "Yes!" : "No!" );
}return 0;
}
Luogu P1410 子序列的更多相关文章
- (luogu P1410)子序列 [TPLY]
子序列 题目链接:https://www.luogu.org/problemnew/show/P1410 吐槽: 这道题做得我心累 本来想好好练一练dp 刷刷水题来练练手感 于是乎打开了(普及+/提高 ...
- 【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 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的 考虑两个长度加起来那一位的数一定是其中一个序列的末尾, ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
随机推荐
- 观察者模式—jdk自带源码分析
一:观察者模式简介 二:jdk实现观察者模式的源码 三:实际例子 四:观察者模式的优点和不足 五:总结 一:观察者模式简介 有时又被称为发布(publish )-订阅(Subscribe)模式.模型- ...
- elk安装配置
ELK介绍 官网https://www.elastic.co/cn/ 中文指南https://www.gitbook.com/book/chenryn/elk-stack-guide-cn/det ...
- python入门学习笔记(一)
写在开头: A:python的交互式环境 ...
- python爬虫循环导入MySql数据库
1.开发环境 操作系统:win10 Python 版本:Python 3.5.2 MySQL:5.5.53 2.用到的模块 没有的话使用pip进行安装:pip install xxx ...
- 测试同学难道要写一辈子的hello world?
最近我们在测试团队内推行自动化用例责任制,大致的意思是:我们安排培训资源,提供技术支持和一对一辅导,要求每一个自主选择了自动化和接口测试发展通道的同学必须让自己负责的项目自动化用例覆盖率有所提升. 后 ...
- js利用闭包封装自定义模块的几种方法
1.自定义模块: 具有特定功能的js文件 将所有的数据和功能都封装在一个函数的内部 只向外暴露一个包含有n个方法的对象或者函数 模块使用者只需要通过模块暴露的对象调用方法来实现相对应的功能 1.利用函 ...
- 关于c++栈溢出的问题
我自己定义了一个数据类型node,嵌套在另一个数据类型当中时候,用到了delete函数, 在我node的声明当中声明了几个指针 在我的析构函数中却调用了delet函数 结果程序结果是能跑出来 提示我栈 ...
- 阿里巴巴十年Java架构师分享,会了这个知识点的人都去BAT了
1.源码分析专题 详细介绍源码中所用到的经典设计思想,看看大牛是如何写代码的,提升技术审美.提高核心竞争力. 帮助大家寻找分析源码的切入点,在思想上来一次巨大的升华.知其然,并知其所以然.把知识变成自 ...
- R语言数据框中,用0替代NA缺失值
1.用0替代数据框中的缺失值NA 生成数据框: > m <- matrix(sample(c(NA, :), , replace = TRUE), ) > d <- as.da ...
- 学习PHP的必备开发工具
对于PHP开发者,在互联网上有很多可用的开发工具,但对于初学者不知道哪个php开发工具比较好,找到一个合适的PHP开发工具是很难的,需要花费很多的时间精力.所以,今天常青春工作室就为初学者推荐几个最好 ...