dynamic programming with tab look up, start from minimal case, expand to full, tab[i] = f(tab[i-1]), convert recursion to tab fill in both directions