传送门

题意:给一个长为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]=min⁡i∈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】相关推荐

  1. Codeforces Round #585 (Div. 2) E. Marbles 状压dp + 逆序对

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑数列最终的状态一定是相同颜色在一起,所以我们发现他的颜色是有顺序的!显然可以用状压dpdpdp来枚举颜色的顺序,但是又有问题了,你怎么确定当前这个 ...

  2. Marbles 【状压dp】

    题目链接:https://vjudge.net/problem/Gym-102348C 一个特别好的状压dp题目,但是突然有点懒,不想写题解了,直接发代码吧. #include <bits/st ...

  3. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  4. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  5. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  6. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  7. 【每日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 ...

  8. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  9. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

  10. P2340 奶牛会展(状压dp)

    P2340 奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由 ...

最新文章

  1. 模块(序列化(jsonpickle)+XML+requests)
  2. How is a Batch request handled in the backend
  3. 了解spring-boot-starter
  4. HTML+CSS+JS实现 ❤️svg图片透明层文本显示❤️
  5. python函数定义与参数_Python函数的定义方式与函数参数问题实例分析
  6. python布尔类型运算_python基础之布尔运算、集合
  7. 实验楼python挑战答案_楼赛第1期-Linux项目挑战 题目解析
  8. 开课吧Java课堂:如何使用迭代函数
  9. python将元祖设为整形_相识python --------str字符串 int整形 bool布尔值 tu元祖 set()集合 dict 字典的数据补充...
  10. PHP学习笔记三(数组API)
  11. [转]C++学习步骤
  12. uni-app 快速入门 从零开始实现新闻资讯类跨端应用(更新中)
  13. word更新目录页码
  14. Android播放音频到耳机,android插入耳机状态使用扬声器外放音乐
  15. C++大型项目开发约束
  16. C18-PEG-ICG18碳烷基链-聚乙二醇-吲哚菁绿,Cholesterol-PEG-ICG胆固醇-聚乙二醇-吲哚菁绿
  17. Pyton学习—循环语句
  18. CSP-J1 CSP-S2第1轮 初赛资料集(2022.09.09)
  19. C#(三十二)之Windows绘图
  20. HDU-6555-The Fool(整除分块)

热门文章

  1. 晚上去宾馆有什么是一定要带的?
  2. 如何用数学方法估算一个女生前男友的数量?
  3. 延迟开学?这些教育读书公众号可以帮助孩子学习! 你都关注了吗?
  4. 世界上没有后悔药,时间匆匆,从关注它们开始......
  5. 浅谈协同过滤推荐算法
  6. c语言宏高级用法,C语言宏高级用法 [总结]
  7. oracle未找到时区,Oracle ADF 未找到时区错误
  8. react 最佳入门_miaov-React 最佳入门
  9. 混凝土墙开洞_满城混凝土柱子切割资质齐全
  10. sae 本地环境 mysql数据库_SAE本地环境与真实环境的差别