ABC225F

题面

link

​ 有n个字符串,从中选出m个以任意顺序拼起来,求所有情况中字典序最小的。

题解

​ 首先考虑如果已经选出了m个字符串,我们应该按什么顺序拼起来。

​ 算是一个trick,重载小于号为S1+S2<S2+S1。(如果交换两个相邻的可以更优的话肯定交换)

​ 但是这个排序方式符合要求吗,会不会出现S1<S2,S2<S3S3<S1的情况呢。

​ 其实不会,你可以将长度相等的两个字符串的字典序比较想象成两个26进制的数比较大小,所以:

S1+S2<S2+S1S1×26|S2|+S2<S2×26|S1|+S1S126|S1|1<S226|S2|1

​ 最后你会发现其实排序依照的只有Si自己的信息,并没有必须得两个字符串才会有意义。

​ 所以按这个方法给字符串排序之后,就可以进行DP看究竟选哪m个。

​ 方法有很多,但错误方法更多。大致原因都是因为字符串没有局部最优得整体最优,即如果S1S2的前缀,则S1<S2的,但可能出现S1+x>S2+x的情况,所以正确DP的核心就是去除这种前缀关系。

  • 方法一:从后往前DP,这样就保证了不会出现前缀的情况,而后缀情况因为后面不会再接新字符串了,所以可以保证最优。转移:

    f[i][j]=min(f[i+1][j],Si+f[i+1][j1])

  • 方法二:将长度引入状态,在相同长度下,字典序最小一定更优,也去除了前缀带来的影响。

启发

  • 给多个字符串拼接最小字典序的排序方法。
  • 处理字符串字典序最小/最大的问题时,注意前缀的情况,以及通过反向DP去除影响。

本文作者:qwq123

本文链接:https://www.cnblogs.com/qwq-123/p/15905626.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   qwq_123  阅读(23)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起