W tym wyzwaniu masz dwie rzeczy:
- Długość sznurka,
N
- Lista ciągów,
L
każda z przypisaną wartością punktową. Każdy ciąg, który nie jest przekazywany, ma wartość punktową 0
Musisz skonstruować ciąg długości N
, aby suma wszystkich punktów podłańcuchowych była jak największa.
Na przykład:
5 [("ABC", 3), ("DEF", 4), ("CDG", 2)]
powinien wyjść
ABCDG
Ponieważ dwa podciągi z punktami ( ABC
i CDG
) mają w sumie 5 punktów, a żadna inna możliwa konstrukcja nie może dać 5 lub więcej punktów.
Podciągi mogą być używane wiele razy w ciągu i mogą się nakładać. Możesz założyć, że punkty będą zawsze dodatnie, długości podciągów będą wynosić od 1 do długości N
znaków i to N > 0
. Jeśli wiele konstrukcji jest maksymalnych, wydrukuj dowolną z nich.
Twój program musi działać w rozsądnym czasie (nie więcej niż minuta dla każdego z przykładów):
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
To jest golf golfowy , więc przygotuj najkrótszą odpowiedź w swoim ulubionym języku!
code-golf
string
sequence
subsequence
Nathan Merrill
źródło
źródło
DEF
krotce brakuje przecinkaOdpowiedzi:
Python 2.7, 503 bajtów
Nie jest to szczególnie gra w golfa, ani nie jest szczególnie wydajne; to tylko stosunkowo skrócone wyliczenie wykonalnych ciągów, które są brutalnie wymuszone. Nie sądzę, że byłoby zbyt trudno stworzyć dopuszczalną heurystykę do użycia z A *, która prawdopodobnie byłaby nieco szybsza. Nie zawracałem sobie tym głowy, ponieważ ta metoda rozwiązuje wszystkie przykłady w około 47 sekund na moim laptopie.
Aby to przetestować:
Wyjaśnienie
v
Funkcja po prostu oblicza wartość danego łańcucha wyszukując wszystkie wystąpienia podciągów w L.m
Funkcja wylicza wszystkie ciągi długościn
z prefikseme
, który może być generowany z podciągów wl
.m
rekurencyjnie nazywa się sobą; pierwsza rozmowa powinna przechodzić w''
dlae
. Na przykład:p
Funkcja po prostu pętli przez wszystkie możliwe ciągi (jak wyliczone przezm
) i zwraca jedną z najwyższych wartości (jak określonov
).Zauważ, że
m
funkcja faktycznie priorytetowo wylicza, sortując na podstawie wartości podciągów. Okazuje się, że nie jest to konieczne do zapewnienia optymalności i faktycznie nieco utrudnia wydajność; Mógłbym zaoszczędzić około 20 bajtów, usuwając go.źródło