【CF1215E】Marbles【状压DP】
传送门
题意:给一个长为NNN的序列aaa,每次操作交换两个相邻位置,求最少操作次数使得所有相同的值连成一片。
N≤400000N \leq 400000N≤400000,ai≤20a_i \leq20ai≤20
我们发现aia_iai很小,盲猜单独考虑
我们重新确认一个宏大的时空观
把所有位置按值分组,然后一组一组加进去。在某一组没有加之前,这个位置是不存在的,即1 3 2
在没有加3
时,1 2
是相邻的。
设cnt[i][j]cnt[i][j]cnt[i][j]表示只有iii和jjj两组数时,把所有iii移到jjj的前面的最小操作次数
这个可以暴力枚举iii和jjj,然后双指针即可
考虑状压
设dp[S]dp[S]dp[S]表示当前加入的数的状态为SSS的最小操作次数 我们新加一个数时,把散装的都移到最前面。因为cntcntcnt是单独考虑的,所以加起来就可以了
即
dp[S]=mini∈S{dp[S−{i}]+∑j∈S,i≠jcnt[i][j]}dp[S]=\min_{i \in S}\{dp[S-\{i\}]+\sum_{j\in S,i\neq j}cnt[i][j]\}dp[S]=i∈Smin{dp[S−{i}]+j∈S,i=j∑cnt[i][j]}
最后的dp[2n−1]dp[2^n-1]dp[2n−1]即答案
复杂度O(na2+2aa2)O(na^2+2^aa^2)O(na2+2aa2)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
using namespace std;
typedef long long ll;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
vector<int> v[20];
ll cnt[20][20],dp[1<<20];
int main()
{int n=read();for (int i=1;i<=n;i++) v[read()-1].push_back(i);for (int i=0;i<20;i++)for (int j=0;j<20;j++)if (i!=j){int pos=-1;for (int k=0;k<v[i].size();k++){while (pos+1<v[j].size()&&v[j][pos+1]<v[i][k]) ++pos;cnt[i][j]+=pos+1;}}dp[0]=0;for (int s=1;s<(1<<20);s++){dp[s]=1e18;for (int i=0;i<20;i++)if (s&(1<<i)){ll sum=0;for (int j=0;j<20;j++)if (s&(1<<j))sum+=cnt[i][j];dp[s]=min(dp[s],dp[s^(1<<i)]+sum); } }cout<<dp[(1<<20)-1];return 0;
}
【CF1215E】Marbles【状压DP】相关推荐
- Codeforces Round #585 (Div. 2) E. Marbles 状压dp + 逆序对
传送门 文章目录 题意: 思路: 题意: 思路: 考虑数列最终的状态一定是相同颜色在一起,所以我们发现他的颜色是有顺序的!显然可以用状压dpdpdp来枚举颜色的顺序,但是又有问题了,你怎么确定当前这个 ...
- Marbles 【状压dp】
题目链接:https://vjudge.net/problem/Gym-102348C 一个特别好的状压dp题目,但是突然有点懒,不想写题解了,直接发代码吧. #include <bits/st ...
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
- UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)
整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
- 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★
昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...
- hdu 4778 Gems Fight! 状压dp
转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...
- 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...
- P2340 奶牛会展(状压dp)
P2340 奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由 ...
最新文章
- 模块(序列化(jsonpickle)+XML+requests)
- How is a Batch request handled in the backend
- 了解spring-boot-starter
- HTML+CSS+JS实现 ❤️svg图片透明层文本显示❤️
- python函数定义与参数_Python函数的定义方式与函数参数问题实例分析
- python布尔类型运算_python基础之布尔运算、集合
- 实验楼python挑战答案_楼赛第1期-Linux项目挑战 题目解析
- 开课吧Java课堂:如何使用迭代函数
- python将元祖设为整形_相识python --------str字符串 int整形 bool布尔值 tu元祖 set()集合 dict 字典的数据补充...
- PHP学习笔记三(数组API)
- [转]C++学习步骤
- uni-app 快速入门 从零开始实现新闻资讯类跨端应用(更新中)
- word更新目录页码
- Android播放音频到耳机,android插入耳机状态使用扬声器外放音乐
- C++大型项目开发约束
- C18-PEG-ICG18碳烷基链-聚乙二醇-吲哚菁绿,Cholesterol-PEG-ICG胆固醇-聚乙二醇-吲哚菁绿
- Pyton学习—循环语句
- CSP-J1 CSP-S2第1轮 初赛资料集(2022.09.09)
- C#(三十二)之Windows绘图
- HDU-6555-The Fool(整除分块)
热门文章
- 晚上去宾馆有什么是一定要带的?
- 如何用数学方法估算一个女生前男友的数量?
- 延迟开学?这些教育读书公众号可以帮助孩子学习! 你都关注了吗?
- 世界上没有后悔药,时间匆匆,从关注它们开始......
- 浅谈协同过滤推荐算法
- c语言宏高级用法,C语言宏高级用法 [总结]
- oracle未找到时区,Oracle ADF 未找到时区错误
- react 最佳入门_miaov-React 最佳入门
- 混凝土墙开洞_满城混凝土柱子切割资质齐全
- sae 本地环境 mysql数据库_SAE本地环境与真实环境的差别