Dynamic programming can be used to solve optimization problems involving overlapping subproblems, such as finding the most valuable subset of items that fit in a knapsack. The knapsack problem is solved by considering all possible subsets incrementally, storing the optimal values in a table. Warshall's and Floyd's algorithms also use dynamic programming to find the transitive closure and shortest paths in graphs by iteratively building up the solution from smaller subsets. Optimal binary search trees can also be constructed using dynamic programming by considering optimal substructures.