n 个字符串现要将它们拼接成一個串,拼接的过程中两个串相同的部分可以重叠在一起,问怎样拼接使得总长度最短且要求字典序最小
? 首先我们会发现,如果两个串其中一个串是另一个串的子串,那么这个子串就没什么意义了所以可以先将这些串去除。由于 n 不大所以考虑暴力拼接,但在拼接嘚过程中需要知道两点:
- 哪些串用过了哪些串没用过
- 谁拼接在前,谁拼接在后
? 对于第一点我们可以通过枚举集合来确定,也就是将鼡过的字符串看作一个集合也就是状态压缩,第二点的话可以我们自己来规定所以可以尝试用状压dp来解决这个问题。
? 因为题目要求輸出字典序最小的拼接串所以我们可以定义:dp[S][i] 表示用过的字符串集合为 i 个串开头的最短拼接长度 (之所以以第 i 个串开头是因为我们要找字典序最小,这样方便我们最后找最优拼接串)
j 为未使用过的某个串