This document discusses dynamic programming and provides examples for solving problems related to longest common subsequences and optimal binary search trees using dynamic programming. It begins with defining the longest common subsequence problem and providing a naive recursive solution. It then shows that the problem exhibits optimal substructure and can be solved using dynamic programming by computing a table of values in a bottom-up manner. A similar approach is taken for the optimal binary search tree problem, characterizing its optimal substructure and computing an expected search cost table to find the optimal tree configuration.