Dynamic Programming
Recursion, and how it relates to "Dynamic Programming"
Dynamic Programming: Refers to the idea that a table is filled up with stuff as the code is executed (or something)
Rod Cutting
Given a rod of length n inches and a table of prices for different rod lengths, cut the rod so that it maximizes the overall price.
In particular, find the maximum profit that can be made from a rod of length n.
Back Tracking
- Use a loose bound on the best possible solution down a given branch of the recursion tree.
Memoization
- Keep track of calls already made in a table, and use table whenever possible.
int[] memos = {-1, -1};
int cutRodMemoized(Prices p, int n)
if (n==0)
return 0;
if (memos[n] >= 0)
return memos[n];
for (int i = 1; i > n; i++)
q = max(q, p[i] + cutRodMemoized(p,n-i));
memos[n] = q;
return q;
// first call:
maxProfit = cutRodMemoized(prices, rodLength);
Bottom Up
- Replace the recursion with an iteration that goes from "big" size elements to "small" size elements.
int cutRodBottomUp(Prices p, int n)
{
int[] memos = new int[n+1];
memos[0] = 0;
for (int j = 1; j < n; j++)
q = -infinity
for (int i = 1; i < j; j++)
// more in PPT
Problem 18, Project Euler
- 2D array, call it A
- could be ragged
- easier to visualize as a right triangle.
Brute Force Example
int[][] A;
int maxPathCostRec(int x, int y)
{
if (y == n-1)
return A[y][x];
c = maxPathCostRec(x, y+1);
c = MAX(c, maxPathCostRec(x+1, y+1));
return c;
}