Vanatoare

Problema se rezolva cu ajutorul programarii dinamice. Sa notam cu Mi multimea {j | al j-lea bit din reprezentarea lui i in baza 2 este 1}. Fie Di numarul minim de vanatori necesari pentru a omori toti mistretii cu numere de ordine din multimea Mi. Relatia de recurenta va fi Di = 1 + minim(DMi-Mj), dupa toate numerele j cu proprietatea ca multimea Mj este inclusa in multimea Mi si toti mistretii din Mj pot fi omorati de acelasi vanator, situat la o coordonata intre 0 si T. Pentru a stabili daca toti mistretii din Mj pot fi omorati de acelasi vanator, vom realiza o preprocesare. Astfel, Ai va fi true daca si numai daca putem plasa un vanator intre 0 si T care sa omoare toti mistretii din Mi. O optimizare evidenta care imbunatateste cu mult timpul de executie este ca pentru o stare i sa eliminam acele j despre care stim sigur ca Aj va fi false. Astfel, daca la un moment dat alegem un numar j pentru care Aj va fi false nu are rost sa consideram nici un numar k, pentru care Mj inclus in Mk, pentru ca Ak va fi sigur false.
Pentru a calcula valoarea lui Ai trebuie sa determinam cel mai mic numar natural P (daca exista) astfel incat vanatorul plasat in P sa poata omori toti mistretii din Mi. Aceasta relatie este echivalenta cu P % vj = cj, pentru orice j inclus in Mi. Pentru a afla numarul P pentru o stare i putem folosi teorema chineza a resturilor. Nu este necesar insa sa aplicam aceasta teorema de la inceput pentru fiecare stare, ci este suficient sa vedem care este ultimul bit j de 1 din i, si sa combinam solutia pentru Mi-{j} si {j}. Ai va fi true daca si numai daca 0 ≤ P ≤ T.
Complexitatea finala va fi O(2N * N) + O(3N) = O(3N).