Cracking Dynammic Programming
All dynamic programming problems may be modeled as a DAG of sub problems. Once you topologically sort that DAG, even tricky challenges, like finding the longest increasing subsequence or stacking cuboids, become as simple as tracing the longest path through your map.