数组$a_i$,每次可以选择相邻交换位置,求最小操作次数使得最后相同颜色都聚在一起。$n\leq 4\times10^5,c\leq 20$
相邻交换,想到了逆序对。(要将相应的权值移动到对应位置就是$a_i$的逆序对)。有$20$种颜色,显然不可能随机赋予权值$20!$。根逆序对一样。可以发现在计算总逆序对的时候有重复的情况。
设$dp[i]$,$i$的二进制表示,对应颜色已经按某种次序聚在一起(其他颜色默认为空)。如果新加入颜色为$k$,$dp[2^k|i]=min(dp[2^k|i],dp[i]+\sum_{p\in i} f[p][k]$,$f[p][k]$表示将颜色$p$放到颜色$k$前面去所需要的代价。
复杂度$O(2^{20}\times 20^2+20n)$,实际计算复杂度会小很多。
代码
1 |
|