Ideea se bazeaza pe o dinamica in n^3. In primul rand pentru orice sir vei folosi n operatii de tipul top(); numarul de operatii de tipul push() va fi tot timpul egal cu numarul de operatii de tipul pop(). Acum problema devine in afla numarul minim de operatii de tipul push() a. i. sa obtii sirul [i..j]; Raspunsul final fiind Nr minim de operatii de a obtine sirul 1...n * 2 (nr de pop-uri) + n (nr de top() -uri); dinamica ar fi dp[ i ] [ j ] = nr minim de operatii de tipul push pentru a obtine sirul i...j;
dp[i][j] = dp[i][j-1] + 1;// pur si simplu mai pun caracaterul Text[j];
sau dp[i][j] = dp[i][k] + dp[k+1][j-1], cu k = i,j-1 si Text[k] == Text[j];// asta inseamna ca fac sirul i...k cu un numar minim de operatii dupa care il fac pe k+1...j-1 si cand il pun pe j nu il pun in mod practic ( adica numai apelez push() ) ci scot tot ce e pe
intervalul [k+1..j-1] si o sa ii dau "top()" de Text[j];