NC19832 1408
题目
题目描述
小m曾经给小t和小s讲过一个奇怪的故事。这个故事叫做1408。故事的大体内容如下。
主人公迈克·安瑟林(约翰·库萨克饰)是一个恐怖小说家。将装神弄鬼作为本职工作的迈克,平日里却是个彻头彻尾的无神论者。为了完成自己的新书,迈克决定找一家“闹鬼”
的房间住上十天,而胆大包天的他最终选择了传闻中最阴森恐怖的海豚酒店的1408号房间。
酒店经理杰拉尔德·奥林(塞缪尔·杰克逊饰)拿出在那个房间中历年来数十起离奇死亡事件的照片,来力劝迈克不要冒险,但迈克满不在乎,坚持着自己的选择。而在搬进1408号房间后,一件件离奇的超自然现象让迈克彻底改变了自己的鬼神人生观。大量恐怖惊悚的真实体验为迈克的新书着实积累了素材,但问题的关键是,他必须得先活着走出那个房间。
以上写的只是简介,实际这个故事细思极恐。而由于小s当时住的宾馆是14楼,所以他有一点点慌。于是回房间之后根小b玩起了一个游戏。
游戏是这样的,小s有n个白球和n个黑球,白球和黑球的编号分别1~n排序。给你2*n行信息,每行第一个是一个字符,B表示它是黑球,W表示它是白球,后面的一个数字表示这个球在它自己的颜色中的编号。每一次可以交换相邻两个球的位置。问北神最少移动几次可以使得对于所有白球,序号是按顺序排列的且所有黑球的序号也是按顺序排列的。
小b觉得这个问题很有意思,所以也请你来做做。
输入描述
输入一个数n,之后给你2*n行信息,信息内容见题面。
输出描述
输出最小的交换次数
示例1
输入
3
B 1
W 2
B 3
W 1
W 3
B 2
输出
4
备注
对于10%的数据n<=10
对于100%的数据n<=2000
题解
知识点:线性dp。
考虑设 \(f_{i,j}\) 表示已经排好了编号前 \(i\) 个白球前 \(j\) 个黑球的最小操作次数。
那么转移十分显然:\(f_{i,j} = \min\{ f_{i-1,j} + val_1, f_{i,j-1}+val_2 \}\) 。
其中 \(val_1\) 表示将第 \(i\) 个白球放到 \(i+j\) 位置的最小花费, \(val_2\) 对黑球同理。
不妨我们考虑 \(val_1\) ,我们只需要知道第 \(i\) 个白球位置到 \(i+j\) 的距离即可。设 \(pos_{i,0}\) 表示白球原来的位置。因为前 \(i-1\) 个白球前 \(j\) 个黑球移动了,所以第 \(i\) 个白球的实际位置也是会变的。
设 \(cnt_{i,j,0}\) 表示在 \(pos_{i,0}\) 之后,编号前 \(i-1\) 的白球和前 \(j\) 的黑球的数量,只有这些球是会到 \(pos_{i,0}\) 之前。我们可以先通过 \(cnt_{k,0,0} = cnt_{k-1,0,0} + [pos_{k,0} < pos_{k-1,0}]\) ,再通过 \(cnt_{i,k,0} = cnt_{i,k-1,0} + [pos_{i,0} < pos_{k,1}]\) ,即可线性处理出 \(cnt\) 。
综上 \(val_1 = pos_{i,0} + cnt_{i,j,0} - (i+j)\) , \(val_2 = pos_{j,1} + cnt_{i,j,1} -(i+j)\) 。
时间复杂度 \(O(n^2)\)
空间复杂度 \(O(n^2)\)
代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int pos[2007][2];
int cnt[2007][2007][2]; // 放了前i-1个白球,前j个黑球,第i个白(第j个黑球)球右边有几个球到它前面
int f[2007][2007];
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
for (int i = 1;i <= 2 * n;i++) {
char ch;
int id;
cin >> ch >> id;
pos[id][ch == 'B'] = i;
}
for (int i = 1;i <= n;i++) {
for (int j = 1;j < i;j++) {
cnt[i][0][0] += pos[i][0] < pos[j][0];
cnt[0][i][1] += pos[i][1] < pos[j][1];
}
for (int j = 1;j <= n;j++) {
cnt[i][j][0] = cnt[i][j - 1][0] + (pos[i][0] < pos[j][1]);
cnt[j][i][1] = cnt[j - 1][i][1] + (pos[i][1] < pos[j][0]);
}
f[i][0] = f[i - 1][0] + pos[i][0] + cnt[i][0][0] - i;
f[0][i] = f[0][i - 1] + pos[i][1] + cnt[0][i][1] - i;
}
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
f[i][j] = min
(
f[i - 1][j] + pos[i][0] + cnt[i][j][0] - (i + j),
f[i][j - 1] + pos[j][1] + cnt[i][j][1] - (i + j)
);
cout << f[n][n] << '\n';
return 0;
}
NC19832 1408的更多相关文章
- BZOJ 1408: [Noi2002]Robot
1408: [Noi2002]Robot Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 510 Solved: 344[Submit][Status][ ...
- bzoj 1408 [Noi2002]Robot(欧拉函数)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1408 [题意] 求m的所有约数中,满足可以分解成(奇数个不同素数/偶数个不同素数/其 ...
- 九度OJ 1408 吃豆机器人 -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1408 题目描述: 淘宝公司内部有许多新鲜的小玩具,例如淘宝智能机器人.小时候,大家都玩过那个吃豆子的游戏吧,这机器 ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- [Jobdu] 题目1408:吃豆机器人
题目描述: 淘宝公司内部有许多新鲜的小玩具,例如淘宝智能机器人.小时候,大家都玩过那个吃豆子的游戏吧,这机器人就是按照这个游戏设计的,它会朝着豆子的方向行走.不过机器人还存在一个bug,他只会朝南和朝 ...
- C题 hdu 1408 盐水的故事
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1408 盐水的故事 Time Limit: 2000/1000 MS (Java/Others) ...
- POJ 1408 Fishnet【枚举+线段相交+叉积求面积】
题目: http://poj.org/problem?id=1408 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...
- Batting Practice LightOJ - 1408
Batting Practice LightOJ - 1408(概率dp) 题意:有无限个球,进球的概率为p,问你连续不进k1个球或者连续进k2个球需要使用的球的个数的期望 思路: \(定义f[i]表 ...
- 题解报告:hdu 1408 盐水的故事
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1408 Problem Description 挂盐水的时候,如果滴起来有规律,先是滴一滴,停一下:然后 ...
- HDU 1408 盐水的故事 数学水题
http://acm.hdu.edu.cn/showproblem.php?pid=1408 题目: 挂盐水的时候,如果滴起来有规律,先是滴一滴,停一下:然后滴二滴,停一下:再滴三滴,停一下...,现 ...
随机推荐
- Spring boot 自定义ThreadPoolTaskExecutor 线程池并进行异步操作
本文为博主原创,转载请注明出处: 1. 使用 ThreadPoolTaskExecutor 封装自定义配置的线程池Bean ThreadPoolTaskExecutor 是Spring 中封装的一个 ...
- java - 标准类的定义
一个标准的类需要拥有下面 4个 组成部分: 1. 所有的成员变量都要使用 private 关键字进行修饰 2. 为每一个成员变量编写 set.get 方法 3. 创建一个无参数的构造方法 4. 创建一 ...
- [转帖]六千字带你了解 Oracle 统计信息和执行计划
https://cloud.tencent.com/developer/article/1616706 大家好,我是 JiekuXu,很高兴又和大家见面了,今天分享下 Oracle 统计信息和执行计划 ...
- [转帖]ORACLE新参数MAX_IDLE_TIME和MAX_IDLE_BLOCKING_TIME简介
https://www.cnblogs.com/kerrycode/p/16856171.html Oracle 12.2 引入了新参数MAX_IDLE_TIME.它可以指定会话空闲的最大分钟数.如果 ...
- Kubeadm 安装支持IPV6 K8S1.28.x的简单过程
Kubeadm 安装支持IPV6 K8S的简单过程 背景 手贱 找了一个晚上想尝试安装一个K8S集群 并且可以支持IPV6 协议栈的 然后就开始各种百度. 各种处理 找到了一堆歪门邪道. 但是还不知道 ...
- [转帖]TiKV 内存参数性能调优
https://docs.pingcap.com/zh/tidb/stable/tune-tikv-memory-performance 本文档用于描述如何根据机器配置情况来调整 TiKV 的参数,使 ...
- [转帖]s3fs把 s3-like 对象存储挂载到本地
s3fs把 s3-like 对象存储挂载到本地 s3fs把 s3-like 对象存储挂载到本地 s3fs-fuse 是一个采用 c++ 开发的开源应用,它的作用是可以将 AWS S3 以及兼容 S3 ...
- [转帖]全球CPU市场格局(2022)
https://www.eet-china.com/mp/a222817.html 本文选自"2022年国产服务器CPU研究框架",重点分析2022年CPU产业链.CPU市场规模. ...
- [转帖]012 Linux 搞懂用户权限升级 (sudo 和 su),包学会
https://my.oschina.net/u/3113381/blog/5431540 Linux 系统中 root 账号通常用于系统的管理和维护,对操作系统的所有资源具有访问控制权限,当一个普通 ...
- [转帖]IO多路复用的三种机制Select,Poll,Epoll
I/O多路复用(multiplexing)的本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作 ...