题目链接

题目

题目描述

小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的更多相关文章

  1. BZOJ 1408: [Noi2002]Robot

    1408: [Noi2002]Robot Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 510  Solved: 344[Submit][Status][ ...

  2. bzoj 1408 [Noi2002]Robot(欧拉函数)

    [题目链接]  http://www.lydsy.com/JudgeOnline/problem.php?id=1408 [题意] 求m的所有约数中,满足可以分解成(奇数个不同素数/偶数个不同素数/其 ...

  3. 九度OJ 1408 吃豆机器人 -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1408 题目描述: 淘宝公司内部有许多新鲜的小玩具,例如淘宝智能机器人.小时候,大家都玩过那个吃豆子的游戏吧,这机器 ...

  4. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  5. [Jobdu] 题目1408:吃豆机器人

    题目描述: 淘宝公司内部有许多新鲜的小玩具,例如淘宝智能机器人.小时候,大家都玩过那个吃豆子的游戏吧,这机器人就是按照这个游戏设计的,它会朝着豆子的方向行走.不过机器人还存在一个bug,他只会朝南和朝 ...

  6. C题 hdu 1408 盐水的故事

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1408 盐水的故事 Time Limit: 2000/1000 MS (Java/Others)     ...

  7. POJ 1408 Fishnet【枚举+线段相交+叉积求面积】

    题目: http://poj.org/problem?id=1408 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...

  8. Batting Practice LightOJ - 1408

    Batting Practice LightOJ - 1408(概率dp) 题意:有无限个球,进球的概率为p,问你连续不进k1个球或者连续进k2个球需要使用的球的个数的期望 思路: \(定义f[i]表 ...

  9. 题解报告:hdu 1408 盐水的故事

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1408 Problem Description 挂盐水的时候,如果滴起来有规律,先是滴一滴,停一下:然后 ...

  10. HDU 1408 盐水的故事 数学水题

    http://acm.hdu.edu.cn/showproblem.php?pid=1408 题目: 挂盐水的时候,如果滴起来有规律,先是滴一滴,停一下:然后滴二滴,停一下:再滴三滴,停一下...,现 ...

随机推荐

  1. Spring boot 自定义ThreadPoolTaskExecutor 线程池并进行异步操作

    本文为博主原创,转载请注明出处: 1. 使用 ThreadPoolTaskExecutor  封装自定义配置的线程池Bean ThreadPoolTaskExecutor 是Spring 中封装的一个 ...

  2. java - 标准类的定义

    一个标准的类需要拥有下面 4个 组成部分: 1. 所有的成员变量都要使用 private 关键字进行修饰 2. 为每一个成员变量编写 set.get 方法 3. 创建一个无参数的构造方法 4. 创建一 ...

  3. [转帖]六千字带你了解 Oracle 统计信息和执行计划

    https://cloud.tencent.com/developer/article/1616706 大家好,我是 JiekuXu,很高兴又和大家见面了,今天分享下 Oracle 统计信息和执行计划 ...

  4. [转帖]ORACLE新参数MAX_IDLE_TIME和MAX_IDLE_BLOCKING_TIME简介

    https://www.cnblogs.com/kerrycode/p/16856171.html Oracle 12.2 引入了新参数MAX_IDLE_TIME.它可以指定会话空闲的最大分钟数.如果 ...

  5. Kubeadm 安装支持IPV6 K8S1.28.x的简单过程

    Kubeadm 安装支持IPV6 K8S的简单过程 背景 手贱 找了一个晚上想尝试安装一个K8S集群 并且可以支持IPV6 协议栈的 然后就开始各种百度. 各种处理 找到了一堆歪门邪道. 但是还不知道 ...

  6. [转帖]TiKV 内存参数性能调优

    https://docs.pingcap.com/zh/tidb/stable/tune-tikv-memory-performance 本文档用于描述如何根据机器配置情况来调整 TiKV 的参数,使 ...

  7. [转帖]s3fs把 s3-like 对象存储挂载到本地

    s3fs把 s3-like 对象存储挂载到本地 s3fs把 s3-like 对象存储挂载到本地 s3fs-fuse 是一个采用 c++ 开发的开源应用,它的作用是可以将 AWS S3 以及兼容 S3 ...

  8. [转帖]全球CPU市场格局(2022)

    https://www.eet-china.com/mp/a222817.html 本文选自"2022年国产服务器CPU研究框架",重点分析2022年CPU产业链.CPU市场规模. ...

  9. [转帖]012 Linux 搞懂用户权限升级 (sudo 和 su),包学会

    https://my.oschina.net/u/3113381/blog/5431540 Linux 系统中 root 账号通常用于系统的管理和维护,对操作系统的所有资源具有访问控制权限,当一个普通 ...

  10. [转帖]IO多路复用的三种机制Select,Poll,Epoll

    I/O多路复用(multiplexing)的本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作 ...