Editorial for Magična Niska
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Primetimo da ćemo u jednom potezu pretvoriti najmanje 3, a najviše 5 karaktera u .
Rešićemo ovaj problem primenom dinamičkog programiranja.
Označimo
kao najveći broj karaktera koje možemo da pretvorimo u
ako gledamo samo sufiks od indeksa
nadalje, možemo da pretvorimo najviše
karaktera, a
nam govori da li smo prethodni karakter pretvorili u
ili ne.
Za slučaj kada je
(
je dužina stringa), rešenje je 0.
Ako znamo da smo poslednji karakter transformisali u
, možemo da zaključimo koji karakter smo transformisali neki od prethodnih elemenata da bi ih transformisali u
.
Tacnije za prethodni karakter (na poziciji
), možemo da zaključimo šta je on bio na početku (pre svih transformacija) i u trenutku pre nego što je postao
(karakter koji se pojavljuje najviše puta na pozicijama
je jedini kandidat), nazovimo ova dva karaktera
i
.
Jedan od mogućih prelaza je da trenutni karakter ne pretvorimo u . Ovo možemo da uradimo ako prethodni karakter takođe nismo transformisali (
) ili prethodni karakter nije bio isti kao trenutni u trenutku transformacije (
, gde je
dati string).
Formula za ovaj prelaz:
.
Svi ostali prelazi uzimaju da trenutni karakter i određen broj karaktera posle njega transformišemo u .
Isto kao što smo mogli da zaključimo karakter u koji smo promenili prethodni karakter pre nego što je postao
, možemo da zaključimo i u koji karakter treba da promenimo trenutni karakter ( ili neki karakter posle njega) kako bi ga transformisali u
(karakter koji se pojavljuje najviše puta na pozicijama
je jedini kandidat).
Kao i za prethodni karakter definisaćemo 2 karaktera
i
po istim pravilima samo za trenutni karakter (karakter na poziciji
umesto
).
Možemo da vidimo da je transformaciju trenutnog karaktera nemoguće izvršiti ako je
i
. Ovo je bitno proveriti zbog slučajeva poput aababb, gde je rešenje
a ne
.
Posmatrajmo slučaj kada hoćemo da tranformišemo trenutni i sledeća 2 karaktera u (slučajevi za 4 i 5 karaktera se rade na isti način).
Transformiasnje trenutnog i sledeća 2 karaktera je moguće uraditi samo kada se tačno jedan od njih razlikuje od
.
Formula za ovaj prelaz:
Rešenje za stanje je maksimum od svih mogućih prelaza (ili minus beskonačno ako nijedan nije moguć).
Konačno rešenje problema se nalazi u stanju .
Zadatak je preuzet sa
, takmičenje
.
Hvala Nikoli Pešiću za pomoć i pisanje editoriala za zadatak.
Comments