Codeforces 1215E 状压DP
题意:给你一个序列,你可以交换序列中的相邻的两个元素,问最少需要交换多少次可以让这个序列变成若干个极大的颜色相同的子段。
思路:由于题目中的颜色种类很少,考虑状压DP。设dp[mask]为把mask为1的颜色从后往前放置的最小花费。那么我们新添加一种颜色时需要知道要转移多少次,所以我们需要预处理转移矩阵c[i][j]。c[i][j]的意思是只考虑i, j两种元素,把所有的元素i移动到元素j前面的最小花费,预处理好之后暴力转移即可。
代码:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 400010;
vector<int> b[20];
int a[maxn];
LL f[1 << 20];
LL c[20][20];
int main() {
int n;
scanf("%d", &n);
memset(f, 0x3f, sizeof(f));
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
b[a[i] - 1].push_back(i);
}
for (int i = 0; i < 20; i++) {
if(!b[i].size()) continue;
for (int j = 0; j < 20; j++) {
if(!b[j].size() || i == j) continue;
int p = 0;
for (int k = 0; k < b[i].size(); k++) {
while(p < b[j].size() && b[j][p] < b[i][k]) p++;
// if(p < b[j].size())
c[i][j] += p;
}
}
}
f[0] = 0;
for (int i = 0; i < (1 << 20); i++) {
vector<int> d;
d.clear();
for (int j = 0; j < 20; j++) {
if((i >> j) & 1) {
d.push_back(j); }
}
for (int j = 0; j < 20; j++) {
if(((i >> j) & 1) == 0) {
LL sum = 0;
for (int k = 0; k < d.size(); k++) {
sum += c[d[k]][j];
}
f[i ^ (1 << j)] = min(f[i ^ (1 << j)], f[i] + sum);
}
}
}
printf("%lld\n", f[(1 << 20) - 1]);
}
Codeforces 1215E 状压DP的更多相关文章
- Codeforces 678E 状压DP
题意:有n位选手,已知n位选手之间两两获胜的概率,问主角(第一个选手)最终站在擂台上的概率是多少? 思路:一看数据范围肯定是状压DP,不过虽然是概率DP,但是需要倒着推:我们如果正着推式子的话,初始状 ...
- Codeforces 8C 状压DP
题意:有个人想收拾行李,而n个物品散落在房间的各个角落里(n < 24).现在给你旅行箱的坐标(人初始在旅行箱处),以及n个物品的坐标,你一次只能拿最多两个物品,并且拿了物品就必须放回旅行箱,不 ...
- CodeForces 11D(状压DP 求图中环的个数)
Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycle with no re ...
- codeforces 1185G1 状压dp
codeforces 1185G1. Playlist for Polycarp (easy version)(动态规划) 传送门:https://codeforces.com/contest/118 ...
- Codeforces 1155F 状压DP
题意:给你一张图,问最少保留多少条边,使得这张图是边双联通分量. 思路:如果一个点集中的点已经是边双联通分量,那么从这个点集中的点x出发,经过若干个不是点集中的点,回到点集中的点y(x可能等于y),那 ...
- Codeforces - 71E 状压DP
参考官方题解 #include<bits/stdc++.h> #define rep(i,j,k) for(register int i=j;i<=k;i++) #define rr ...
- codeforces#1215E. Marbles(状压DP)
题目大意:给出一个由N个整数组成的序列,通过每次交换相邻的两个数,使这个序列的每个相同的数都相邻.求最小的交换次数. 比如给出序列:1 2 3 2 1 ,那么最终序列应该是 1 1 2 2 3 ,最小 ...
- codeforces Diagrams & Tableaux1 (状压DP)
http://codeforces.com/gym/100405 D题 题在pdf里 codeforces.com/gym/100405/attachments/download/2331/20132 ...
- Codeforces Gym 100015F Fighting for Triangles 状压DP
Fighting for Triangles 题目连接: http://codeforces.com/gym/100015/attachments Description Andy and Ralph ...
随机推荐
- 5分钟让你知道什么是PKI
转:https://www.cnblogs.com/jerain6312/p/8572841.html 前言 Public Key Infrastructure(PKI),中文叫做公开密钥基础设施,也 ...
- 深入探究JVM(2) - 探秘Metaspace
Java 8彻底将永久代移除出了HotSpot JVM,将其原有的数据迁移至Java Heap或Metaspace.这一篇文章我们来总结一下Metaspace(元空间)的特性.如有错误,敬请指出,谢谢 ...
- canvas 时钟案例
<!doctype html><html><head> <meta charset="UTF-8"> <meta name=& ...
- 解决RHEL6 vncserver 启动 could not open default font 'fixed'错误.
https://blog.csdn.net/silencegll/article/details/51320629
- linux安装 redis
通过源码编译安装 1.下载源码包 wget http://download.redis.io/releases/redis-4.0.10.tar.gz 2.解压缩redis tar -zxf redi ...
- VUE(vue对象的简单属性)
一:全局过滤器和局部过滤器 ps:不管是局部过滤器还是全局过滤器,一定都要有renturn 返回 <!DOCTYPE html> <html lang="en"& ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_7_字符输出流的续写和换行
追加写就是后面参数设置为true 加入换行符
- Numpy 基础函数
日后用的着的时候再说,存下来.方便日后查看 NumPy数组使你可以将许多种数据处理任务表述为简洁的数组表达式(否则需要编写循环).用数组表达式代替循环的做法,通常被称为矢量化. 原来一直不明白什么叫矢 ...
- 16/7/7_PHP-构造\解析函数
昨天又问老师问题,老师还是强调要用博客之类记录下每天的学习的习惯. 我个人的想法是一些知识点不用笔记一下 在脑海的理解不是太深.但是老师都这么说了我老师乖乖的记录下今天的学习的一些知识.心得.技巧等等 ...
- SpringBoot错误经验
1.在application.properties 添加 debug=true,可以看见项目的执行流程有助于调bug 2.如果错误显示端口号被占用 cmd 步骤1 查看端口号应用情况:netstat ...