Dynamic programming
Dynamic programming solves a problem by splitting it into smaller problems of the same kind, solving each of them once and storing the answers in a table. It applies when the same smaller problems come up again and again, which is what makes a plain recursive solution slow.
Dynamic programming answers a question from the answers to smaller questions of the same kind, works out each smaller answer only once and keeps it in a table. It is for "the fewest", "the most" and "how many ways" questions where trying every choice would ask the same smaller questions again and again. If you need to list every arrangement itself, use backtracking instead.
Kadane's algorithm finds the largest sum of a subarray, a block of consecutive elements of an array (a list of numbers stored in order), in one pass from left to right.
Grid paths are a dynamic programming method for a grid where you move only right or down: it counts the paths from the top-left to the bottom-right cell, or finds the path with the largest or smallest sum. If moves can also go up or left, use BFS for the fewest steps or Dijkstra's algorithm for the cheapest path.
Coin change is the problem of paying an amount with coins of given values, with as many coins of each value as you like: pay it with the fewest coins, or count the ways to pay it. Both questions are solved by filling a table over the amounts from 0 up to the one you pay. If each coin can be used only once, see knapsack instead.
The knapsack problem asks for the most valuable set of items that fits in a backpack: each item has a weight and a value, the backpack holds a limited total weight, and each item is taken (1) or left (0), so it is also called the 0/1 knapsack. It is solved with a table over the items and the capacities. If each item can be taken any number of times, it is solved like coin change, where one array holds the answer for each amount; if items can be cut into pieces, taking the most value per kilogram first is enough.
The longest increasing subsequence of an array is the longest list of its numbers that go up from left to right when the others are crossed out. The numbers don't have to stand next to each other; for the longest run of adjacent increasing numbers, one pass is enough. Dynamic programming finds it in O(n^2), and a sorted helper array with binary search finds it in O(n \log n).
The longest common subsequence (LCS) of two strings is the longest string you can get from both of them by crossing out letters. Dynamic programming finds it with a grid over the beginnings (prefixes) of the two strings in time. If the common part must be one unbroken piece of both strings, you need the longest common substring, a different problem.
The edit distance between two strings, also called the Levenshtein distance, is the fewest single-letter insertions, deletions and replacements that turn one string into the other. Spell checkers use it to suggest the dictionary words closest to what was typed. Dynamic programming finds it with a grid over the prefixes of the two strings in time.