题目链接

题目

题目描述

小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. Java 客户端访问kafka

    本文为博主原创,未经允许不得转载: 1. 引入maven依赖 <dependency> <groupId>org.apache.kafka</groupId> &l ...

  2. centos7 systemctl配置开机自启动服务

    centos7使用systemctl替代原来/etc/init.d,按官方的说法是提高系统服务的运行效率.服务配置更加简单易用,对于一些自定义的服务来配置开机自启动,是真的香! 概念理解 它是服务管理 ...

  3. [转帖]配置 Windows XP 正常上网(TLS HTTPS),连接到 NAS

    https://zhuanlan.zhihu.com/p/208685816# 学习一下. 知乎用户8kqKq9 等 45 人赞同了该文章 Windows XP 是经典的.高效的.可靠的.性能良好的操 ...

  4. Nginx日志规则以及根据日志进行性能问题判断的思路

    Nginx日志规则以及根据日志进行性能问题判断的思路 背景 Nginx是开源方案里面能实现反向代理 负载均衡的首选. 但是有时候性能出问题比较难以分析和定位, 不知道是不是nginx的瓶颈 性能问题的 ...

  5. [转帖]SPEC CPU 2017 单线程整数性能测试与总结 (2022)

    https://zhuanlan.zhihu.com/p/574105237 x86处理器的整数性能在过去4年间取得了长足的进步 x86处理器移动端性能缩水非常严重 ARM公版的旗舰级处理器相比前代进 ...

  6. [转帖]深入了解 gRPC:协议

    https://cn.pingcap.com/blog/grpc 经过很长一段时间的开发,TiDB 终于发了 RC3.RC3 版本对于 TiKV 来说最重要的功能就是支持了 gRPC,也就意味着后面大 ...

  7. Python学习之十九_程序运行时间的验证

    Python学习之十九_程序运行时间的验证 背景 最近一段时间比较忙. 而且还遇到了一个lua脚本优化redis访问的场景. 想着自己还在学习python(时断时续) 所以想借着这个场景,学习一下py ...

  8. Python学习之六_同时访问Oracle和Mysql的方法

    Python学习之六_同时访问Oracle和Mysql的方法 背景 jaydebeapi 可以访问大部分数据库. 但是他有一个问题是仅能够访问一种类型的数据库. 如果同事连接两种数据库,那么就会出现问 ...

  9. gcore的学习

    gcore的学习-解决jmap无法生成dump文件的一种方法 背景 周末在跆拳道馆看孩子练跆拳道. 开着笔记本翻到了 扣钉日记 公众号里面的讲解 想着自己也遇到过无法保存dump文件的情况. 所以想学 ...

  10. [转帖]07-rsync企业真实项目备份案例实战(需求收集--服务器配置---客户端配置---报警机制---数据校验---邮件告警)

    https://developer.aliyun.com/article/885820?spm=a2c6h.24874632.expert-profile.279.7c46cfe9h5DxWK 简介: ...