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