Cat despre rezolvare (pe care se pare ca au intuit-o toti concurentii),
ea se baza pe programare dinamica. Se construieste o matrice A de dimensiune
N*S, in care A [I, J] are semnificatia : exista A [I, J] numere de I cifre
cu suma cifrelor J. Matricea se completeaza linie cu linie, iar formula
de recurenta este A[I, J] = suma cu K de la min (J-9, 1) pana la J din
A [I-1, K]. Rezultatul se colecteaza din A [N, S].
Singurul 'artificiu' era memorarea a numai 2 linii din matrice (in loc
de intreaga matrice, care nu incapea in memorie). Intr-adevar, se vede
usor ca la un moment dat sunt necesare doar linia precedenta si linia
curenta din matrice.
As fi vrut (din pacate, nu s-a putut) sa pot face o diferenta intre
sursele de complexitate O (N*S) si cele de complexitate, sa zicem,
O (10*N*S). Insa deoarece rezultatele se garantau ca fiind de tip LongInt,
nu am putut da teste in care produsul N*S sa fie suficient de mare. Chiar
si asa (intrucat corectarea am facut-o de fapt pe un DX2-66Mhz), am putut
remarca mici diferente intre timpii de rulare ale surselor (care s-au
incadrat totusi in timp).
Ei, cam asta ar fi ... A, inca ceva : il rog si pe aceasta cale pe
Cristi Cadar (Patron, Sef, Rege si Imparat Absolut al Listei :-) ) sa va
actualizeze DFCC-urile, deoarece eu unu' nu am nici o idee despre formula
complicata cu care se incrementeaza un asemenea coeficient.
|
|