Aliens

Problema se rezolva cu ajutorul programarii dinamice. Fiecare fractie din cele date se poate scrie ca un produs de forma 2x * 3y * 5z, unde x, y si z sunt numere intregi. Daca codificam fiecare fractie prin tripletul corespunzator, problema revine la a selecta anumite triplete (x1, y1, z1), (x2, y2, z2)... (xK yK zK) din cele N astfel incat:

  • x1 + x2 + ... + xK ≥ 0
  • y1 + y2 + ... + yK ≥ 0
  • z1 + z2 + ... + zK ≥ 0
  • 2(x1 + x2 + ... + xK) * 3(y1 + y2 + ... + yK) * 5(z1 + z2 + ... + zK) sa fie maxim posibil.

Fie Di, x3, x5 valoarea maxim posibila pentru exponentul lui 2 care se poate obtine din primele i fractii, astfel incat exponentul lui 3 sa fie x3 si exponentul lui 5 sa fie x5. Tabloul D poate contine si indici negativi! Relatia de recurenta este urmatoarea:
Di, x3, x5 = maxim(Di-1, x3, x5, Di-1, x3-x3', x5-x5' + x2'), unde (x2' ×3' x5') este tripletul asociat celei de a i-a fractii.
Din considerente de memorie nu vom retine tot tabloul D. Deoarece elementele de pe pozitii de forma (i, a, b) depind doar de elemente de pe pozitii de forma (i-1, a', b') vom retine o singura matrice in locul unui tablou tridimensional si vom actualiza elementele din aceasta matrice printr-o parcurgere convenabila a indicilor.
Dupa ce avem tabloul D construit, aflam maxim(2DN,x3,x5 * 3x3 * 5x5), cu DN, x3, x5 ≥ 0, x3 ≥ 0 si x5 ≥ 0. Pentru a compara doua numere 2x1 * 3y1 * 5z1 si 2x2 * 3y2 * 5z2 vom logaritma si vom compara x1*ln2 + y1*ln3 + z1*ln5 cu x2*ln2 + y2*ln3 + z2*ln5. Atunci cand am aflat o solutie optima, este necesara implementarea operatiilor pe numere mari, deoarece rezultatul nu se incadreaza in nici un tip de date conventional.
Complexitatea problemei este O(N3) de constanta 4*(log3MAX)*(log5MAX), unde MAX = 400.000.000. Aceasta solutie obtine 100 de puncte.