拦住我的状压

题意:

  • 给定一个数组a,且1≤a[i]≤20,a, 且1\leq a[i]\leq 20,a,且1≤a[i]≤20,你现在可以交换其中任意的相邻的两个元素, 现在要求将整个序列变成"相同元素挨在一起"的最少交换次数

数据范围: 2≤n≤4e52 \leq n \leq4e52≤n≤4e5

>> face <<

前置技能:状压dp

Tutorial: 很容易想到用mask来表示颜色的状态, 这里我们用mask表示被选中的颜色排在最前面的情况, 于是我们就可以被选择的颜色让他排在第一位, 然后更新代价, 由于我们选择的颜色是相对位置, 不一定是要排在真正的第一位, 只用排在若干个被选择的颜色的前面成了, 所以考虑维护fir[i][j]fir[i][j]fir[i][j]代表将颜色i全放在颜色j前面要移动多少个颜色j, 这样就可以直接算将i颜色放在相对其他颜色的第一个的代价了

注意状态"0", 然后开ll

#include <bits/stdc++.h>
#include <bits/extc++.h>using namespace std;
#define _rep(n, a, b) for (ll n = (a); n <= (b); ++n)
#define _rev(n, a, b) for (ll n = (a); n >= (b); --n)
#define _for(n, a, b) for (ll n = (a); n < (b); ++n)
#define _rof(n, a, b) for (ll n = (a); n > (b); --n)
#define oo 0x3f3f3f3f3f3f
#define ll long long
#define db double
#define eps 1e-8
#define bin(x) cout << bitset<10>(x) << endl;
#define what_is(x) cerr << #x << " is " << x << endl
#define met(a, b) memset(a, b, sizeof(a))
#define all(x) x.begin(), x.end()
#define pii pair<ll, ll>
const ll mod = 1e9 + 7;
const ll maxn = 2e5 + 5;
ll n, m;vector<vector<ll>> fir;
vector<ll> dp((1 << 20) + 1);
vector<ll> cnt(25);
signed main()
{cin >> n;fir.assign(21, vector<ll> (21, 0));_rep(i, 1, n){ll tmp;cin >> tmp;cnt[tmp]++;_rep(j, 1, 20){fir[tmp][j] += cnt[j];}}_for(mask, 1, (1<<20)){ll sub_min = oo;_rep(i, 0, 20){if((1 << i) & mask){//把i提到最前面的情况ll this_round = 0;_rep(j, 0, 20){if(i == j || ((1 << j) & mask) == 0)continue;this_round += fir[i+1][j+1];}sub_min = min(sub_min, this_round + dp[mask ^ (1 << i)]);}}dp[mask] = sub_min;}cout << dp[(1<<20) - 1] << endl;
}

cf1215E-Marbles相关推荐

  1. 【CF1215E】Marbles【状压DP】

    传送门 题意:给一个长为NNN的序列aaa,每次操作交换两个相邻位置,求最少操作次数使得所有相同的值连成一片. N≤400000N \leq 400000N≤400000,ai≤20a_i \leq2 ...

  2. UVa10672 - Marbles on a tree(BFS)

    n boxes are placed on the vertices of a rooted tree, which are numbered from 1 to n, 1 ≤ n ≤ 10000. ...

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

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

  4. (Fabric 学习六)Fabric2.0 私有数据 使用marbles官方示例

    私有数据 从v1.2开始,Fabric 提供了创建私有数据集合的功能,它允许在通道上定义的组织子集能够背书.提交或查询私有数据,而无需创建单独的通道. 产生的原因:一个通道上的一组组织需要对该通道上的 ...

  5. 超级账本Fabric区块链用弹珠游戏Marbles 部署

    Marbles 演示 Marbles GitHub地址 关于 Marbles 这个应用程序的基础网络是 Hyperledger Fabric,后者是一个 Linux Foundation 项目.您可能 ...

  6. E -Marbles

    链接:https://ac.nowcoder.com/acm/contest/18462/E 来源:牛客网 题目描述 For a booth at the campus spring carnival ...

  7. Marbles CodeForces - 1215E 状态压缩dp

    问题: Monocarp has arranged nn colored marbles in a row. The color of the ii-th marble is aiai. Monoca ...

  8. codechef : Marbles 题解

    版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/.未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...

  9. SPOJ MARBLES

    // http://www.spoj.com/problems/MARBLES/ #include <iostream> using namespace std;// 假设30个位置 vo ...

  10. Hyperledger Fabric 实例 marbles部署错误解决

    marbles弹珠实验部署错误解决 采用以下链接教程部署时 https://segmentfault.com/a/1190000014874290 在执行该命令node install_chainco ...

最新文章

  1. 张仰彪第二排序法_十大排序之冒泡和选择排序
  2. 酷!一键构建我自己的PHP框架的开发环境
  3. vue java 插件开发_实习模块vue+java小型全栈开发(三)
  4. whitepages 被关闭_除了滑动关闭APP影响电池寿命,还有哪些操作触碰到了你的知识盲区?...
  5. 2006.08.10
  6. 农业谋定竞争力-农业大健康·万祥军:质量效益促品牌农业
  7. 「软件项目管理」一文详解软件项目管理概述
  8. (100)FPGA RAM实现(V实现)
  9. 查看google chrome版本号及浏览器驱动下载
  10. 分形与数据结构第一篇(神奇的色子)
  11. 程序内购买 图文攻略
  12. 用于Visio的官方cisco 图标库下载地址
  13. python os模块安装方法_Python模块——os模块详解
  14. 腾讯云学生机(官网入口)
  15. python写圣诞祝福_圣诞节啊,用Python写一棵圣诞树出来
  16. 模型的评估指标(一)
  17. 微信朋友圈得内容可以爬取吗?看完这篇你心里就有底了
  18. 安卓开发基础知识3(国内深度摄像头方案)
  19. R markdown的笔记02
  20. 计算机专业教师演讲稿,计算机专业演讲稿2篇

热门文章

  1. 量化研究 | 多空不对称
  2. canon 计数器清零软件
  3. vue-cli3中解决axios跨域问题(以360壁纸为例)
  4. python调用api接口获取天气数据_python 接口实战--天气API
  5. 如何在Android手机上退出Google帐号
  6. 光环国际PMP:一条关于项目经理的深刻思考
  7. 看原版英文和译版中文
  8. noip提高组初赛有感——
  9. metal分析是什么意思_metal是什么意思
  10. 51单片机数据类型及范围