Codeforces Round #658 (Div. 2) D. Unmerge(dp)
2024-08-28 00:52:15
题目链接: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();
}
最新文章
- Top Coder算法题目浏览器
- 重新理解:ASP.NET 异步编程
- CSS3透明属性opacity
- 十分钟轻松让你认识ASP.NET MVC6
- “VS2013无法连接远程数据库”解决方案
- Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux
- JS 随机数
- POJ C程序设计进阶 编程题#2:角谷猜想
- 51nod1711 平均数
- 转:XMLP报表导出为excel时设置文本不自动转为数字
- SQL语句操作文件
- 两种常用的启动和关闭MySQL服务
- python split()黑魔法
- [LeetCode OJ] Linked List Cycle II—Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
- [Javascript] property function &;&; Enumeration
- Django学习手册 - csrf
- maven-javadoc-plugin 出现错误Unsupported major.minor version 51.0
- gateway-workman
- 关于Arch Linux efibootmgr 命令行参数问题
- C语言第四次实验
热门文章
- 用python+sklearn(机器学习)实现天气预报数据 模型和使用
- 科来网络通讯协议图2019版(OSI七层模型)
- 2021升级版微服务教程6—Ribbon使用+原理+整合Nacos权重+实战优化 一篇搞定
- Java多线程-锁的区别与使用
- redis存json数据时选择string还是hash
- top有用的开关控制命令
- MyBatis初级实战之四:druid多数据源
- mybatis中传集合时 报异常 invalid comparison: java.util.Arrays$ArrayList and java.lang.String
- 数据库性能调优之始: analyze统计信息
- Flask源码关于local的实现