落谷 P1410 子序列
题目链接。
Discription
给定长度为 \(n\) 的序列 \(A\)(\(n\) 为偶数),判断是否能将其划分为两个长度为 \(\dfrac{N}{2}\) 的严格递增子序列。
Solution
不妨按下标从小到大考虑每个数要分给哪一组,比较明显的 DP,朴素时空复杂度太高。
在朴素中,我们需要知道四个信息:
- 第一组的长度
- 第一组最后一个数的数值
- 第二组的长度
- 第二组最后一个数的长度
- 由于所有数都得填,所以当填完前 \(i\) 个数的时候,肯定有一组的末尾是 \(A[i]\),可以降一个维度
- 考虑把可行性 DP,把一个状态,用贪心最优性搞在状态里,这题的最后一个数的数值显然越小越好(容错率越高)。
这样状态数量就在两维了,每次转移其实就是考虑这个数到两个组中的哪一个,应该是可以接受的。
状态设计
设 \(f_{i, j}\) 为填完了前 \(i\) 个数,以 \(a[i]\) 结尾的那组长度为 \(j\),所能构成的另外一组最后一个数的的最小值。
状态转移
”我为人人“ 式转移可能更好理解:
- 考虑将 \(A[i + 1]\) 填入以 \(A[i]\) 结尾的组里,需要满足 $A[i] < A[i + 1] $,转移为 \(f_{i + 1, j + 1} = \min(f_{i, j})\)
- 将第 \(A[i + 1]\) 填入另一组组里,需要满足 \(f_{i, j} < A[i + 1]\),转移为 \(f_{i + 1, i - j + 1} = \min(A[i])\)
最后检测 \(f_{n, n / 2}\)是否等于无穷即可。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N = 2005, INF = 0x3f3f3f3f;
int n, a[N], f[N][N >> 1];
int main() {
while (~scanf("%d", &n)) {
memset(f, 0x3f, sizeof f);
for (int i = 1; i <= n; i++) scanf("%d", a + i);
f[1][1] = -1;
for (int i = 1; i < n; i++) {
for (int j = 1; j * 2 <= n; j++) {
if (f[i][j] == INF) continue;
if (a[i] < a[i + 1]) f[i + 1][j + 1] = min(f[i + 1][j + 1], f[i][j]);
if (f[i][j] < a[i + 1]) f[i + 1][i - j + 1] = min(f[i + 1][i - j + 1], a[i]);
}
}
puts(f[n][n / 2] != INF ? "Yes!" : "No!");
}
return 0;
}
落谷 P1410 子序列的更多相关文章
- 洛谷P1410 子序列
题目描述 给定一个长度为N(N为偶数)的序列,问能否将其划分为两个长度为N/2的严格递增子序列, 输入输出格式 输入格式: 若干行,每行表示一组数据.对于每组数据,首先输入一个整数N,表示序列的长度. ...
- 洛谷 P1410 子序列(DP)
这题的题解的贪心都是错误的...正解应该是个DP 考虑有哪些有关的条件:两个序列的当前长度, 两个序列的末尾数, 把这些都压进状态显然是会GG的 考虑两个长度加起来那一位的数一定是其中一个序列的末尾, ...
- (luogu P1410)子序列 [TPLY]
子序列 题目链接:https://www.luogu.org/problemnew/show/P1410 吐槽: 这道题做得我心累 本来想好好练一练dp 刷刷水题来练练手感 于是乎打开了(普及+/提高 ...
- 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,表示序列的长度. ...
- 洛谷 [T21776] 子序列
题目描述 你有一个长度为 \(n\) 的数列 \(\{a_n\}\) ,这个数列由 \(0,1\) 组成,进行 \(m\) 个的操作: \(1\ l\ r\) :把数列区间$ [l,r]$ 内的所有数 ...
- P1410 子序列
题目描述 给定一个长度为N(N为偶数)的序列,问能否将其划分为两个长度为N/2的严格递增子序列, 输入输出格式 输入格式: 若干行,每行表示一组数据.对于每组数据,首先输入一个整数N,表示序列的长度. ...
- 洛谷T21776 子序列
题目描述 你有一个长度为 nn 的数列 \{a_n\}{an} ,这个数列由 0,10,1 组成,进行 mm 个的操作: 1~l~r1 l r :把数列区间 [l, r][l,r] 内的所有数取反. ...
随机推荐
- Android自定控件基础(一)——几何图形绘制
虽然本人有几年开发经验,但是自定义控件这一块儿,研究的很少,惭愧--用到的时候就是百度查找,复制粘贴.工时紧,总是想的快点完工就好.(都是借口啦,想学总会有时间哒) 作为一个Android开发 要说自 ...
- Git-stash(暂存)
修改某文件后,不想commit,使用stash保存在本地的某分支内 # 暂存 git stash ## 可暂存新增文件 git stash -u ## 为此次暂存添加标识 git stash save ...
- Boost命令行解释器的简单使用:Boost.Program_options
简介 如果使用比较多的命令行程序的话,对于命令行参数的输入肯定不会陌生,大部分的程序都是通过类似下面的形式进行输入的,比如熟悉的ls ls --all -l --color=auto 这里面包含了三种 ...
- Nacos服务发现源码解析
1.Spring服务发现的统一规范 Spring将这套规范定义在Spring Cloud Common中 discovery包下面定义了服务发现的规范 核心接口:DiscoveryClient 用于服 ...
- MySQL索引背后的数据结构及原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- Fastjson远程代码执行漏洞复现
fastjson漏洞简介 Fastjson是一个Java库,可用于将Java对象转换为其JSON表示形式.它还可以用于将JSON字符串转换为等效的Java对象,fastjson爆出多个反序列化远程命令 ...
- 计算思维(美国CMU周以真教授)
博主注:GIScience会议是国际上最为著名的地理信息系统领域的国际会议,自2000年起,每两年举办一次,GIScience 2008会议邀请了美国卡内基-梅隆大学(CMU)计算机系华裔教授周以真博 ...
- ABBYY FineReader 15 新增编辑表格单元格功能
ABBYY FineReader 15(Windows系统)新增编辑表格单元格功能,在PDF文档存在表格的前提下,可将表中的每个单元格作为单独的文字块进行单独编辑,单元格内的编辑不会影响同一行中其他单 ...
- iOS 默认Cell选中
NSInteger selectIndex = [NSIndexPath indexPathForItem:0 inSection:0]; [self.ui_tableView selectRowAt ...
- JavaSE 学习笔记06丨并发
Chapter 12. 并发 12.1 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,并发指的是在一段时间内宏观上有多个程 ...