This document provides an overview of dynamic programming. It begins by defining dynamic programming as an algorithm design method for problems that can be solved through a sequence of decisions. It then outlines the four steps for developing a dynamic programming algorithm and discusses the principle of optimality. The document compares dynamic programming to greedy methods and divide-and-conquer approaches. It also explains how dynamic programming can be applied to multistage graph problems using both forward and backward approaches. Finally, it provides an overview of the Floyd-Warshall algorithm for solving all-pairs shortest path problems.