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 题目: 挂盐水的时候,如果滴起来有规律,先是滴一滴,停一下:然后滴二滴,停一下:再滴三滴,停一下...,现 ...
随机推荐
- SV task and function
内容 system verilog过程语句:自增和自减操作符 逻辑比较操作符 逻辑值为1bit inside语句 变量类型转换 强制类型转换:$cast() 变量位宽转换 变量符号位转换 for循环语 ...
- 使用Python+FFMPEG实现视频分割与合并
前言 日常中偶尔会遇到需要简单剪辑处理视频的场景,以前我可能会拿出PR来剪辑一下,(别跟我说国产那些软件,剪辑完视频强制加上广告片头片尾恶心的一批),但是PR毕竟太重量级,剪个简单的视频都要花不少时间 ...
- TLS 加密套件的学习与了解
TLS 加密套件的学习与了解 加密套件 什么是加密套件? 加密套件是用于在SSL / TLS握手期间协商安全设置的算法的组合. 在ClientHello和ServerHello消息交换之后,客户端发送 ...
- parquet极简学习
parquet极简学习 摘要 parquet的概念: Parquet文件是一种列式存储文件格式,广泛应用于大数据处理框架, 如Apache Hadoop和Apache Spark. 它通过将数据组织成 ...
- 人大金仓学习之一_kwr的简单学习
人大金仓学习之一_kwr的简单学习 摘要 周末在家想着学习一下数据库相关的内容. 网上找了不少资料, 想着直接在本地机器上面进行一下安装与验证 理论上linux上面应该更加简单. windows 上面 ...
- 【转帖】You can now run a GPT-3-level AI model on your laptop, phone, and Raspberry Pi
https://arstechnica.com/information-technology/2023/03/you-can-now-run-a-gpt-3-level-ai-model-on-you ...
- [转帖]jumpserver (Linux资产管理快速入门)
准备工作 准备三台虚拟机,一台作为jumpserver的服务端,两台作为测试端. 一.安装好jump server后,输入IP地址登录 [192.168.2.111为本机测试地址] 二.创建用户组 这 ...
- [转帖]Nginx 性能测试
https://plantegg.github.io/2022/10/10/Nginx%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/ 压测工具选择 wrk ,apache ...
- [转帖]NOHZ = ON如何影响Linux内核中的do_timer()?
https://www.jb51.cc/faq/897483.html 如何解决NOHZ = ON如何影响Linux内核中的do_timer()?? 首先,让我们了解什么是tickless kerne ...
- Booking.com如何在毫秒内搜索数百万个地点
译自:How Booking.com Searches Through Millions of Locations in Milliseconds Booking.com是一家与酒店.旅馆.度假租赁等 ...