You've solved problems where state fits in an array or tree structure. But what happens when you need to tile a grid, where each column's state depends on the previous column's incomplete cells? I'll show you broken profile DP (dynamic programming), where you track the "profile" of unfilled cells between columns as a bitmask.
You'll solve tiling problems by filling grids column by column, with transitions based on how tiles can fit. By the end, you'll recognize when problems need broken profile DP and implement solutions for grids with different tile shapes.