落谷 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] 内的所有数取反. ...
随机推荐
- TTL门和MOS门悬空输入的处理
引言 本来是数字电路学习时很重要的考点,但是总容易忘掉,所以记录一下~ 内容 TTL TTL电路中的TTL是Transistor-Transistor-Logic的英文缩写,指的是晶体管逻辑电路,即T ...
- opencv 学习1 gui属性
1.图像 先定一个小目标学习两个个功能 1.学习怎样读入一副画像,以及如何保存一副图像 2.学习三个函数cv2.imread(), cv2.imshow() , cv2.imwrite() 1.1读入 ...
- 高性能arm运行ceph存储基准测试
关于arm 之前wdlab对外发布过一次约500个节点的arm的ceph集群,那个采用的是微集群的结构,使用的是双核的cortex-a9 ARM处理器,运行速度为1.3 GHz,内存为1 GB,直接焊 ...
- cgroup实践-资源控制
1.Cgroup安装 安装Cgroups需要libcap-devel和libcgroup两个相关的包 yum install gcc libcap-devel 2.Cgroup挂载配置 Cgroup对 ...
- centos搭建dns服务
原文:(https://www.myjinji.top/articles/2020/04/02/1585800289945.html)[https://www.myjinji.top/articles ...
- deepin20 作为生产力安装体验
deepin 20安装使用体验,先看一下桌面吧! deepin介绍 简单介绍一下deepin吧,中文名称:深度操作系统,是由武汉深之度科技有限公司在Debian基础上开发的Linux操作系统,注意国内 ...
- v-echarts安装
npm install v-echarts echarts --save
- MathType中如何实现上下两行公式“=”号对齐
作为功能强大的数学公式编辑器,MathType可以轻松输入各种复杂的公式和符号,与 Office 文档完美结合,显示效果超好,比 Office 自带的公式编辑器要强大很多,可以为办公文档.网页.桌面出 ...
- 详解pdfFactory的页面管理功能
当我们将文档载入到pdfFactory 之后才发现文档中存在着一些乱页现象.那么是否需要重新整理文档后,再重新载入到软件中呢?实际上,不需要. pdfFactory专业版提供了高效的页面管理功能,用户 ...
- Postman实用小技巧
Postman使用小技巧 软件测试工程师 张江涛 废话就不多说了,直奔主题,这里的技巧就以对话方式来阐述吧. 问:公司的环境也太多了吧,本地.开发.测试以及生产环境,这么多环境,每次使用的时候都要来回 ...