This document discusses maximum likelihood sequence detection and the Viterbi algorithm. It begins with an outline and introduction of MLSD. It then describes the Viterbi algorithm, how it uses dynamic programming to detect symbol sequences. It discusses the tools needed for Viterbi algorithm sequence detection including state diagrams and trellises. It provides a step-by-step example of how the Viterbi algorithm works. Finally, it discusses how the Viterbi algorithm can be extended to MLSD and how MLSD works for binary and M-ary signal detection using trellises and minimizing path metrics.