В этом соревновании вам передаются две вещи:
- Длина строки,
N
- Список строк,
L
каждая с назначенным значением точки. Любая строка, которая не передана, имеет значение 0
Вам нужно построить строку длины N
так, чтобы сумма всех точек подстроки была как можно большей.
Например:
5 [("ABC", 3), ("DEF", 4), ("CDG", 2)]
должен выводить
ABCDG
Потому что две подстроки с точками ( ABC
и CDG
) имеют в общей сложности 5 баллов, и никакая другая возможная конструкция не может дать 5 или более баллов.
Подстроки могут использоваться в строке несколько раз и могут перекрываться. Вы можете предположить, что точки всегда будут положительными, длина подстроки будет от 1 до длин N
символов, и это N > 0
. Если несколько конструкций максимальны, выведите любую из них.
Ваша программа должна быть запущена за разумное время (не более минуты для каждого из примеров):
1 [("A", 7), ("B", 4), ("C", 100)] => C
2 [("A", 2), ("B", 3), ("AB", 2)] => AB
2 [("A", 1), ("B", 2), ("CD", 3)] => BB
2 [("AD", 1), ("B", 2), ("ZB", 3)] => ZB
3 [("AB", 2), ("BC", 1), ("CA", 3)] => CAB
3 [("ABC", 4), ("DEF", 4), ("E", 1)] => DEF
4 [("A", 1), ("BAB", 2), ("ABCD", 3)] => AAAA or ABAB or BABA or ABCD
5 [("A", 1), ("BAB", 2), ("ABCD", 3)] => BABCD or BABAB
5 [("ABC", 3), ("DEF", 4), ("CDG", 2)] => ABCDG
5 [("AB", 10), ("BC", 2), ("CA", 2)] => ABCAB
6 [("AB", 10), ("BC", 2), ("CA", 2)] => ABABAB
8 [("AA", 3), ("BA", 5)] => BAAAAAAA
10 [("ABCDE", 19), ("ACEBD", 18), ("ABEDC", 17), ("BCEDA", 16), ("EBDAC", 15), ("BACD", 14), ("CADB", 13), ("ABDC", 12), ("CABD", 11), ("EBDC", 10), ("ACE", 9), ("CBA", 8), ("AEC", 7), ("BE", 6), ("AE", 5), ("DC", 4), ("BA", 3), ("A", 2), ("D", 1)]
=> ACEBDACEBD
Это код-гольф , поэтому подготовьте кратчайший ответ на своем любимом языке!
code-golf
string
sequence
subsequence
Натан Меррилл
источник
источник
DEF
Кортеж отсутствует запятаяОтветы:
Python 2.7, 503 байта
Это не особенно игра в гольф, и при этом это не особенно эффективно; это просто относительно сжатое перечисление возможных строк, которые являются грубыми. Я не думаю, что было бы слишком сложно создать допустимую эвристику для использования с A *, что, вероятно, было бы немного быстрее. Однако я не стал этого делать, потому что этот метод решает все примеры за 47 секунд на моем ноутбуке.
Чтобы проверить это:
объяснение
v
Функция просто вычисляет значение заданной строки путем поиска всех вхождений подстрок в L.m
функция перечисляет все строки длиныn
с префиксом ,e
который может быть получен из подстрок вl
.m
рекурсивно называет себя; первый вызов должен пройти в''
течениеe
. Например:p
Функция просто перебирает все возможные строки (как нумеруютсяm
) и возвращает один с наибольшим значением (как определеноv
).Обратите внимание, что
m
функция фактически устанавливает приоритеты перечисления путем сортировки на основе значений подстрок. Это оказывается ненужным для обеспечения оптимальности и фактически немного снижает эффективность; Я мог бы сохранить ~ 20 или около того байтов, удалив его.источник