codeforces#1215E. Marbles(状压dp)
题目链接:
http://codeforces.com/contest/1215/problem/E
题意:
至少多少次操作可以使得相同的数都是相邻的
每次操作可以交换两个相邻的数
数据范围:
$1\leq n \leq 400000$
$1\leq a_i \leq 20$
分析:
定义$dp[i]$,$i$是状态,如果某位是1,那么就固定好了该颜色
$dp[i]$为$i$状态下需要交换的最少次数
定义$ma[i][j]$,只考虑$i,j$两种颜色时,把$i$放前面$j$放后面的最少移动次数
每次固定一个颜色在已固定颜色的末尾,计算当前颜色和已经固定颜色的贡献,然后转移
$ans=dp[(1<<20)-1]$
ac代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
const int maxn=2e5+10;
ll ma[22][22],dp[(1<<20)+7];
vector<int>ve[22];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
ve[x].push_back(i);
} for(int i=1;i<=20;i++){
for(int j=1;j<=20;j++){
if(i==j)continue;
for(int k=0;k<ve[i].size();k++){
// cout<<"sda"<<endl;
int v=ve[i][k];
if(ve[j].size()==0||ve[j][0]>v)continue;
int st=0,en=ve[j].size()-1;
while(st!=en){
int md=(st+en)/2;
if(ve[j][md+1]<v)st=md+1;
else en=md;
}
ma[i][j]+=st+1;
// cout<<"sda"<<endl;
}
}
}
int len=(1<<20);
for(int i=1;i<len;i++)dp[i]=1e18;
for(int i=0;i<len;i++){
//cout<<i<<endl;
for(int j=1;j<=20;j++){
if((i&(1<<(j-1)))==0){
ll res=0;
for(int k=1;k<=20;k++)
if((i&(1<<(k-1))))res+=ma[k][j];
dp[i+(1<<(j-1))]=min(res+dp[i], dp[i+(1<<(j-1))]);
}
}
}
printf("%lld\n",dp[len-1]);
return 0;
}
codeforces#1215E. Marbles(状压dp)的更多相关文章
- codeforces#1215E. Marbles(状压DP)
题目大意:给出一个由N个整数组成的序列,通过每次交换相邻的两个数,使这个序列的每个相同的数都相邻.求最小的交换次数. 比如给出序列:1 2 3 2 1 ,那么最终序列应该是 1 1 2 2 3 ,最小 ...
- E. Marbles 状压dp
E. Marbles 这个是一个状压dp 题目大意是:给你一个数组,数组的数在1到20之间,有一个操作就是交换相邻的两个数,问 让所有相同的数相邻的最小操作次数 dp[s] 表示s状态下的操作次数,w ...
- codeforces 11D(状压dp)
传送门:https://codeforces.com/problemset/problem/11/D 题意: 求n个点m条边的图里面环的个数 题解: 点的范围只有19,很容易想到是状压. dp[sta ...
- Codeforces Round #585 (Div. 2) E. Marbles(状压dp)
题意:给你一个长度为n的序列 问你需要多少次两两交换 可以让相同的数字在一个区间段 思路:我们可以预处理一个数组cnt[i][j]表示把i放到j前面需要交换多少次 然后二进制枚举后 每次选择一个为1的 ...
- Codeforces 1215E 状压DP
题意:给你一个序列,你可以交换序列中的相邻的两个元素,问最少需要交换多少次可以让这个序列变成若干个极大的颜色相同的子段. 思路:由于题目中的颜色种类很少,考虑状压DP.设dp[mask]为把mask为 ...
- Codeforces Round #585 (Div. 2) E. Marbles (状压DP),BZOJ大理石(同一道题)题解
题意 林老师是一位大理石收藏家,他在家里收藏了n块各种颜色的大理石,第i块大理石的颜色为ai.但是林老师觉得这些石头在家里随意摆放太过凌乱,他希望把所有颜色相同的石头放在一起.换句话说,林老师需要对现 ...
- 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 ...
- Codeforces Gym 100610 Problem K. Kitchen Robot 状压DP
Problem K. Kitchen Robot Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10061 ...
- 状压dp Codeforces Beta Round #8 C
http://codeforces.com/contest/8/problem/C 题目大意:给你一个坐标系,给你一个人的目前的坐标(该坐标也是垃圾桶的坐标),再给你n个垃圾的坐标,这个人要捡完所有的 ...
随机推荐
- Asp.net core中间件实现原理及用法解说
简述asp.net core中间件的实现思路 原文地址:https://www.cnblogs.com/shengyu-kmust/p/11583974.html 一次http请求的过程,就是对一个R ...
- ubuntu14.04
14.10显卡驱动有问题 1.恢复启动引导菜单:启动盘 -> 运行到分区之前,不要分区 -> shift+f10 进入dos -> bootsec /fixmbr ->关闭重启 ...
- CUDA 笔记
名词解释 SM :Streaming Multiprocessor 而 Block 大致就是对应到 SM 所有的blocks 按照流水线被送到6个SM中进行计算 在 Compute Ca ...
- js中undefined的几种情况
1.变量声明且没有赋值: 2.获取对象中不存在的属性时: 3.函数需要实参,但是调用时没有传值,形参是undefined: 4.函数调用没有返回值或者return后没有数据,接收函数返回的变量是und ...
- # JDK7+ MethodHandle
简单例子 import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.i ...
- stm32 红外
相关文章:http://blog.csdn.net/zhangxuechao_/article/details/75039906 举例 u8 ir_tick() //记录高电平时间 { u8 i = ...
- linux服务脚本
#!/bin/sh ARG=$1 case $ARG in start): nohup /path/program & ;; stop): pkill program ;; restart): ...
- 5.Redis的持久化
Redis中数据的持久化有两种方式:RDB(Redis DataBsse) 和 AOF(Append Only File),默认采取的是RDB方式 RDB 1.是什么:在指定的时间间隔内将内存中的数据 ...
- Image Processing and Analysis_15_Image Registration:Image matching as a diffusion process: An analogy with Maxwell's demons——1998
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
- 文件格式 rdp
auto connect:i:1full address:s:公网访问IP地址username:s:Administrator