Dynamic algorithm: what's the difference between memorization and bottom-up algorithm?
The algorithms are indeed very similar, but there are several differences:


Order of evaluation: The bottom-up algorithm specifies a particular order of evaluation, which ensures that when OPT[i] is due to be computed, all the prerequisites have already been computed. In the memoization algorithm, this is taken care of automatically.
Evaluated entries: The bottom-up algorithm evaluates all entries of OPT, even though only OPT[n] is needed. The memoization algorithm only computes the entries that are necessary for computing OPT[n].


Two other differences, which are not encountered in this example:


Indexing: The bottom-up algorithm stores its entries in a simple array. The memoization algorithm, in more general instances, uses an association array (i.e., dictionary or hash table).
Memory term: The memoization algorithm remembers all entries which have been computed. A smart bottom-up algorithm could "forget" some of them.


Summarizing, the memoization algorithm is simpler to program. In terms of efficiency, the memoization algorithm has the advantage that only the necessary entries are calculated. In other instances, however, a lot can be saved by implementing a dedicated algorithm, in terms of indexing cost and, especially, memory usage.