E: Keyboard Purchase
题意
给你一个有小写字母组成的字符串,让你给每个字母编号,使得$\sum\limits{i=1}^{n}|S_i-S{i-1}|$的值最小
思路
因为字母种类很小,所以我们可以用类似状压来记录中间值,具体的是$dp[(1<<m)]$来记录当前状态出现的字母种类与还未出现的字母种类的距离。
我们现在先想象一个键盘,$dp[i]$的二进制表示就是键盘前几个的键,那么$dp[i]$的转移就是由$dp[i^(1<<j)]$新加了一位j转移得来:
1 | for (int i = 1; i < (1<<m); i ++) { |
得到的就是当前状态下的最小花费,
那么这样的话,原来的$dp[i^(1<<j)]$的状态不确定的这一位已经确定,那么其他还尚未却动的键与当前已经确定的键之间的距离要$+1$,
1 | for (int i = 1; i < (1<<m); i ++) { |
AC代码
1 |
|