Dynamic Programming CISC5835, Algorithms for Big Data CIS, Fordham Univ. Instructor: X. Zhang
Rod Cutting Problem • A company buys long steel rods (of length n), and cuts them into shorter one to sell • integral length only • cutting is free • rods of diff lengths sold for diff. price, e.g., • Best way to cut the rods? • n=4: no cutting: $9, 1 and 3: 1+8=$9, 2 and 2: 5+5=$10 • n=5: ? 2
Rod Cutting Problem Formulation • Input: • a rod of length n • a table of prices p[1…n] where p[i] is price for rod of length i • Output • determine maximum revenue r n obtained by cutting up the rod and selling all pieces • Analysis solution space (how many possibilities?) • how many ways to write n as sum of positive integers? • 4=4, 4=1+3, 4=2+2 • # of ways to cut n: 3
Rod Cutting Problem Formulation • // return r_n: max. revenue • int Cut_Rod (int p[1…n], int n) • Divide-and-conquer? • how to divide it into smaller one? • we don’t know we want to cut in half… 4
Rod Cutting Problem • // return r n : max. revenue for rod of length n • int Cut_Rod (int n, int p[1…n]) • Start from small • n=1, r 1 =1 //no possible cutting • n=2, r 2 =5 // no cutting (if cut, revenue is 2) • n=3, r 3 =8 //no cutting • r 4 =9 (max. of p[4], p[1]+r 3 , p[2]+r 3, p[3]+r 1 ) • r 5 = max (p[5], p[1]+r 4 , p[2]+r 2 , p[3]+r 2 , p[4]+r 1 ) • … 5
Rod Cutting Problem • // return r n : max. revenue for rod size n • int Cut_Rod (int n, int p[1…n]) • Given a rod of length n, consider first rod to cut out • if we don’t cut it at all, max. revenue is p[n] • if first rod to cut is1: max. revenue is p[1]+r n-1 • if first rod to cut out is 2: max. revenue is p[2]+r n-2, … • max. revenue is given by maximum among all the above options • r n = max (p[n], p[1]+r n-1 , p[2]+r n-2 , …, p[n-1]+r 1 ) 6
Optimal substructure • // return r n : max. revenue for rod size n • int Cut_Rod (int n, int p[1…n]) • r n = max (p[n], p[1]+r n-1 , p[2]+r n-2 , …, p[n-1]+r 1 ) • Optimal substructure : Optimal solution to a problem of size n incorporates optimal solutions to problems of smaller size (1, 2, 3, … n-1). 7
Rod Cutting Problem • // return r_n: max. revenue for rod size n • int Cut_Rod (int p[1…n], int n) • r n = max (p[n], p[1]+r n-1 , p[2]+r n-2 , …, p[n-1]+r 1 ) 8
Recursive Rod Cutting • // return r_n: max. revenue for rod size n Running time T(n) • int Cut_Rod (int p[1…n], int n) Closed formula: T(n)=2 n Recursive calling tree: n=4 9
Subproblems Graph • Avoid recomputing subproblems again and again by storing subproblems solutions in memory/table (hence “programming”) • trade-off between space and time • Overlapping of subproblems 10
Dynamic Programming • Avoid recomputing subproblems again and again by storing subproblems solutions in memory/ table (hence “programming”) • trade-off between space and time • Two-way to organize • top-down with memoization • Before recursive function call, check if subproblem has been solved before • After recursive function call, store result in table • bottom-up method • Iteratively solve smaller problems first, move the way up to larger problems 11
Memoized Cut-Rod // stores solutions to all problems // initialize to an impossible negative value // A recursive function // If problem of given size (n) has been solved before, just return the stored result // same as before… 12
Memoized Cut-Rod: running time // stores solutions to all problems // initialize to an impossible negative value // A recursive function // If problem of given size (n) has been solved before, just return the stored result // same as before… 13
Bottom-up Cut-Rod // stores solutions to all problems // Solve subproblem j, using solution to smaller subproblems Running time: 1+2+3+..+n-1=O(n 2 ) 14
Bottom-up Cut-Rod (2) // stores solutions to all problems What if we want to know who to achieve r[n]? i.e., how to cut? i.e., n=n_1+n_2+…n_k, such that p[n_1]+p[n_2]+…+p[n_k]=r n 15
Recap • We analyze rod cutting problem • Optimal way to cut a rod of size n is found by • 1) comparing optimal revenues achievable after cutting out the first rod of varying len, • This relates solution to larger problem to solutions to subproblems • 2) choose the one yield largest revenue 16
maximum (contiguous) subarray • Problem: find the contiguous subarray within an array ( containing at least one number ) which has largest sum (midterm lab) • If given the array [-2,1,-3,4,-1,2,1,-5,4], • contiguous subarray [4,-1,2,1] has largest sum = 6 • Solution to midterm lab • brute-force: n 2 or n 3 • Divide-and-conquer: T(n)=2 T(n/2)+O(n), T(n)=nlogn • Dynamic programming? 17
Analyze optimal solution • Problem: find contiguous subarray with largest sum • Sample Input: [-2,1,-3,4,-1,2,1,-5,4] (array of size n=9) • How does solution to this problem relates to smaller subproblem? • If we divide-up array (as in midterm) • [-2,1,-3,4,-1,2,1,-5,4] //find MaxSub in this array [-2,1,-3,4,-1] [2,1,-5,4] still need to consider subarray that spans both halves This does not lead to a dynamic programming sol. • Need a different way to define smaller subproblems! 18
Analyze optimal solution • Problem: find contiguous subarray with largest sum A Index • MSE(k), max. subarray ending at pos k, among all subarray ending at k (A[i…k] where i<=k), the one with largest sum • MSE(1), max. subarray ending at pos 1, is A[1..1], sum is -2 • MSE(2), max. subarray ending at pos 2, is A[2..2], sum is 1 MSE(3) is A[2..3], sum is -2 • • MSE(4)? 19
Analyze optimal solution • A • Index • MSE(k) and optimal substructure • MSE(3): A[2..3], sum is -2 (red box) • MSE(4): two options to choose • (1) either grow MSE(3) to include pos 4 How a problem’s optimal solution can be derived from • subarray is then A[2..4], sum is optimal solution to smaller MSE(3)+A[4]=-2+A[4]=2 problem • (2) or start afresh from pos 4 • subarray is then A[4…4], sum is A[4]=4 (better) • Choose the one with larger sum, i.e., • MSE(4) = max (A[4], MSE(3)+A[4]) 20
Analyze optimal solution • A • Index • MSE(4)=4, array is A[4…4] • MSE(k) and optimal substructure • Max. subarray ending at k is the larger between A[k…k] and Max. subarray ending at k-1 extended to include A[k] MSE(k) = max (A[k], MSE(k-1)+A[k]) • MSE(5)= , subarray is • MSE(6) • MSE(7) • MSE(8) • MSE(9) 21
Analyze optimal solution • A • Index • Once we calculate MSE(1) … MSE(9) • MSE(1)=-2, the subarray is A[1..1] • MSE(2)=1, the subarray is A[2..2] • MSE(3)=-2, the subarray is A[2..3] • MSE(4)=4, the subarray is A[4…4] • … MSE(7)=6, the subarray is A[4…7] • MSE(9)=4, the subarray is A[9…9] • What’s the maximum subarray of A? • well, it either ends at 1, or ends at 2, …, or ends at 9 • Whichever yields the largest sum! 22
Idea to Pseudocode • A • Index (int, start,end) MaxSubArray (int A[1…n]) • Calculate MSE(1) … MSE(n) { // Use array MSE to store the MSE(i) • MSE(1)= A[1] MSE[1]=A[1]; • MSE(i) = max (A[i], A[i]+MSE(i-1)); max_MSE = MSE[1]; • Return maximum among all MSE(i), for (int i=2;i<=n;i++) for i=1, 2, …n { MSE[i] = ?? if (MSE[i] > max_MSE) { max_MSE = MSE[i]; Practice: end = i; 1) fill in ?? } 2) How to find out the starting index of } the max. subarray, i.e., the start parameter? return (max_MSE, start, end) } 23
Running time Analysis int MaxSubArray (int A[1…n], int & start, • It’s easy to see that int & end) running time is O(n) { // Use array MSE to store the MSE(i) • a loop that iterates MSE[1]=A[1]; for n-1 times max_MSE = MSE[1]; • Recall other solutions: for (int i=2;i<=n;i++) { • brute-force: n 2 or n 3 MSE[i] = ?? • Divide-and-conquer: if (MSE[i] > max_MSE) { nlogn max_MSE = MSE[i]; • Dynamic programming end = i; } wins! } return max_MSE; } 24
What is DP? When to use? • We have seen several optimization problems • brute force solution • divide and conquer • dynamic programming • To what kinds of problem is DP applicable? • Optimal substructure : Optimal solution to a problem of size n incorporates optimal solution to problem of smaller size (1, 2, 3, … n-1). • Overlapping subproblems : small subproblem space and common subproblems 25
Optimal substructure • Optimal substructure : Optimal solution to a problem of size n incorporates optimal solution to problem of smaller size (1, 2, 3, … n-1). • Rod cutting: find r n (max. revenue for rod of len n) Sol to problem Sol to problem instance of size n instance of size n-1, n-2, … 1 r n = max (p[1]+r n-1 , p[2]+r n-2 , p[3]+r n-3 ,…, p[n-1]+r 1, p[n]) • A recurrence relation (recursive formula) • => Dynamic Programming: Build an optimal solution to the problem from solutions to subproblems • We solve a range of sub-problems as needed 26
Recommend
More recommend