CF1215E Marbles

该博客介绍了CF1215E问题的解决方法,涉及珠子排列优化,需要通过最少的操作次数使相同颜色的珠子相邻。问题转化为计算逆序对数量,利用动态规划和状压DP进行求解。博主提供了分析思路及代码实现。
摘要由CSDN通过智能技术生成

 题目

有 n (n \le 4 * 10^5)(n≤4∗105) 个珠子 , 第ii个珠子颜色是c_i (c_i \le 20)ci​(ci​≤20) , 每次操作把相邻的两个珠子交换。现在要把相同颜色的珠子排列在相连的一段,问至少要多少次操作 。

输入格式
第一行:一个数n

第二行:n个数,表示珠子的颜色

输出格式
一行:至少交换的次数

输入输出样例
输入 #1 复制

7
3 4 2 3 4 2 2
3

5
20 1 14 10 2

0

13
5 5 4 4 3 5 7 6 5 4 4 6 5

21

分析&&题解

看到ai<=20,可以用状压dp

同时,这道题可以发现与逆序对是有关的(参考归并排序)

把题目转化一下,我们把同种颜色重新赋一个权值,那么最后的目标顺序其实可以是一个从小到大权值排序的序列,那么对原数组重新赋值后,就是逆序对了

定义dp[i]表示赋权值方式为i的情况所得到的逆序对个数,且我们赋权值的时候后赋值的值要比前面的大

如有一个原序列{3,1,2,2},那么dp[3]=dp[(011)] = 0 , 方法是将1赋值为1,2赋值为2,是从dp[2] = dp[(010)] = 0转移过来

那么我们转移的时候就是枚举一种颜色k,然后将这个颜色去掉后的状态j,那么就是dp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值