题目链接:https://codeforces.com/contest/1382/problem/D

题意

给出一个大小为 $2n$ 的排列,判断能否找到两个长为 $n$ 的子序列,使得二者归并排序后能够得到该排列。

题解

将原排列拆分为一个个连续子序列,每次从大于上一子序列首部的元素处分出下一连续子序列,只要将这些子序列按照拆分先后排列,归并排序后一定可以得到原排列。

之后即判断能否将这些子序列排列为两个长为 $n$ 的序列即可,可以用状压 $dp$,也可以用 $01$ 背包。

状态 $dp$:每次将之前的每一个可行长度加上当前长度得到新一批的可行长度,然后将当前长度标记为可行。

$01$ 背包:将每个子序列的长度视为其花费与价值,最后判断花费为 $n$ 的背包总价值是否为 $n$ 即可。

代码一

状压 $dp$:$O_{(\frac{n^2}{w})}$ ($w$ 视机器字长而定,参考资料

#include <bits/stdc++.h>
using namespace std; void solve() {
int n; cin >> n;
int mx = 0;
vector<int> idx;
for (int i = 0; i < 2 * n; ++i) {
int x; cin >> x;
if (x > mx) {
mx = x;
idx.push_back(i);
}
}
idx.push_back(2 * n);
vector<int> len;
for (int i = 1; i < idx.size(); ++i) {
len.push_back(idx[i] - idx[i - 1]);
}
bitset<2020> dp;
for (auto i : len) {
dp |= dp << i;
dp[i] = 1;
}
cout << (dp[n] ? "YES" : "NO") << "\n";
} int main() {
int t; cin >> t;
while (t--) solve();
}

代码二

$01$ 背包:$O_{(vn)}$

#include <bits/stdc++.h>
using namespace std; void solve() {
int n; cin >> n;
int mx = 0;
vector<int> idx;
for (int i = 0; i < 2 * n; ++i) {
int x; cin >> x;
if (x > mx) {
mx = x;
idx.push_back(i);
}
}
idx.push_back(2 * n);
int N = idx.size() - 1, p = 0;
int cost[N] = {}, val[N] = {};
for (int i = 1; i < idx.size(); ++i) {
cost[p] = val[p] = idx[i] - idx[i - 1];
++p;
}
map<int, int> dp;
for (int i = 0; i < N; ++i) {
for (int j = n; j >= cost[i]; --j) {
dp[j] = max(dp[j], dp[j - cost[i]] + val[i]);
}
}
cout << (dp[n] == n ? "YES" : "NO") << "\n";
} int main() {
int t; cin >> t;
while (t--) solve();
}

最新文章

  1. Top Coder算法题目浏览器
  2. 重新理解:ASP.NET 异步编程
  3. CSS3透明属性opacity
  4. 十分钟轻松让你认识ASP.NET MVC6
  5. “VS2013无法连接远程数据库”解决方案
  6. Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux
  7. JS 随机数
  8. POJ C程序设计进阶 编程题#2:角谷猜想
  9. 51nod1711 平均数
  10. 转:XMLP报表导出为excel时设置文本不自动转为数字
  11. SQL语句操作文件
  12. 两种常用的启动和关闭MySQL服务
  13. python split()黑魔法
  14. [LeetCode OJ] Linked List Cycle II—Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
  15. [Javascript] property function &amp;&amp; Enumeration
  16. Django学习手册 - csrf
  17. maven-javadoc-plugin 出现错误Unsupported major.minor version 51.0
  18. gateway-workman
  19. 关于Arch Linux efibootmgr 命令行参数问题
  20. C语言第四次实验

热门文章

  1. 用python+sklearn(机器学习)实现天气预报数据 模型和使用
  2. 科来网络通讯协议图2019版(OSI七层模型)
  3. 2021升级版微服务教程6—Ribbon使用+原理+整合Nacos权重+实战优化 一篇搞定
  4. Java多线程-锁的区别与使用
  5. redis存json数据时选择string还是hash
  6. top有用的开关控制命令
  7. MyBatis初级实战之四:druid多数据源
  8. mybatis中传集合时 报异常 invalid comparison: java.util.Arrays$ArrayList and java.lang.String
  9. 数据库性能调优之始: analyze统计信息
  10. Flask源码关于local的实现