Two ways of not enumerating
Most interesting computational problems are optimisation problems: among exponentially many candidates, find the best one. Choosing a subset of jobs means searching subsets. Aligning two strings of length means searching an astronomical number of alignments. Enumeration is not an option.
Dynamic programming and greedy algorithms are two ways of not enumerating. Both make the same underlying move: express the answer in terms of answers to smaller versions of the same problem, so an exponential search collapses into a polynomial number of reusable pieces.
Neither works on every problem. Both rest on a structural property that the problem either has or does not have, and the real skill is recognising that property rather than memorising recurrences. This lesson establishes the property. The rest of the path builds both techniques on top of it.

