Лучшее, что я могу придумать - это ветвь и связка. Создайте структуру данных «промежуточное состояние», которая состоит из
- Буквы, которые вы уже использовали (с кратностью)
- Количество символов, которые вы все еще можете использовать
- Письма еще доступны
- Слова все еще в вашем списке
- Количество слов в вашем списке (количество в предыдущем наборе)
- Количество слов, которые невозможно в этом состоянии
- Количество слов, которые уже включены в выбранные вами буквы
Вы бы начали с
- Пустой набор
- 13
- {A, B, ..., Z}
- Весь ваш список
- N
- 0
- 0
Поместить эту структуру данных в очередь.
На каждом шаге
Pop an item from the queue
Split into possible next states (branch)
Bound & delete extraneous possibilities
Из состояния я бы сгенерировал возможные следующие состояния следующим образом:
For each letter L in the set of letters left
Generate a new state where:
you've added L to the list of chosen letters
the least letter is L
so you remove anything less than L from the allowed letters
Так, например, если ваш оставшийся набор равен {W, X, Y, Z}, я бы сгенерировал одно состояние с W, добавленным к моему выбору, {W, X, Y, Z} все еще возможно, один с X в качестве моего выбора, {X, Y, Z} все еще возможен (но не W), один с Y в качестве моего выбора и {Y, Z} все еще возможен, и один с Z в качестве моего выбора и {Z} все еще возможен .
Делайте все различные расчеты, чтобы выяснить новые состояния.
В каждом штате есть как минимум слова «Количество слов, которые уже охвачены выбранными вами буквами», и максимум это число плюс «Количество слов, все еще находящихся в вашем списке». Из всех состояний найдите самый высокий минимум и удалите все состояния с максимальным значением выше этого.
Не требуется специального обращения со спидометром.
Не могу представить, что это будет быстро, но это сработает.
Возможно, существует некоторая оптимизация (например, сохраняйте каждое слово в вашем списке как массив AZ числа вхождений и объединяйте слова с одинаковой структурой: 2 вхождения AB ..... T => BAT и TAB ). То, как вы сортируете и отслеживаете минимальное и максимальное значения, также, вероятно, может помочь. Вероятно, этого недостаточно для асимптотической разницы, но, возможно, для проблемы, достаточно большой, чтобы запустить ее в разумное время, а не в экстремальное время.