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 ...
随机推荐
- Leetcode刷题C#版之 Median of Two Sorted Arrays
题目: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...
- PLECS_晶闸管调速系统_9w
3. 直流电机开环调压调速系统模型搭建 (1)电路图 (2)仿真 当 α = pi / 2.7 的时候,直流电机的稳定转速大约保持很低的速度. 随着α的减少,直流电机的速度逐渐增大.当α = pi / ...
- Android Stutio 3.0 - Gradle sync failed
0.Android Studio 权威教程 (url:http://blog.csdn.net/column/details/zsl-androidstudio.html) 1. 项目老是报错: Gr ...
- Spring框架系列(二)之Bean的注解管理
微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.Spring中的两种容器 在系列(一)中我们已经知道,Spring 是管理对象的容器,其中有 ...
- Maven json包找不到解决办法
在Maven中央仓库找到Maven的jar <dependency> <groupId>net.sf.json-lib</groupId> <artifact ...
- MySQL 之 视图、触发器、存储过程、函数、事物与数据库锁
浏览目录: 1.视图 2.触发器 3.存储过程 4.函数 5.事物 6.数据库锁 7.数据库备份 1.视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据 视 ...
- rgba 和 IE 的 filter数值转换
- CSRF与xss的区别
CSRF:无法获取受害者的cookie,无法看到cookie: 只是利用受害者是被服务器信任的(靠验证cookie),而给服务器发送请求: xss:利用cookie只是xs ...
- 第1章 PCI总线的基本知识
PCI总线作为处理器系统的局部总线,主要目的是为了连接外部设备,而不是作为处理器的系统总线连接Cache和主存储器.但是PCI总线.系统总线和处理器体系结构之间依然存在着紧密的联系. PCI总线作为系 ...
- 如何利用Plxmon工具进行在线烧录PCI卡的EEPROM
PLXMON是PLX公司提供的用于在线烧录PCI卡的EEPROM的工具. 烧录EEPROM有两种方式,一是比较传统的方法,即采用烧录机进行烧录.采用这种方式时,在调试过程中EEPROM需采用插件式封装 ...