Dynamic programming. Curs 2015

Similar documents
Dynamic programming. Curs 2017

Dynamic Programming. Cormen et. al. IV 15

CSE 202 Dynamic Programming II

CSE 421 Weighted Interval Scheduling, Knapsack, RNA Secondary Structure

Aside: Golden Ratio. Golden Ratio: A universal law. Golden ratio φ = lim n = 1+ b n = a n 1. a n+1 = a n + b n, a n+b n a n

CSE 431/531: Analysis of Algorithms. Dynamic Programming. Lecturer: Shi Li. Department of Computer Science and Engineering University at Buffalo

6. DYNAMIC PROGRAMMING I

Dynamic Programming 1

CS473 - Algorithms I

Chapter 6. Dynamic Programming. Slides by Kevin Wayne. Copyright 2005 Pearson-Addison Wesley. All rights reserved.

Dynamic Programming( Weighted Interval Scheduling)

Dynamic Programming: Interval Scheduling and Knapsack

CSE 421 Dynamic Programming

Computer Science & Engineering 423/823 Design and Analysis of Algorithms

Dynamic Programming. Weighted Interval Scheduling. Algorithmic Paradigms. Dynamic Programming

Computer Science & Engineering 423/823 Design and Analysis of Algorithms

Copyright 2000, Kevin Wayne 1

/633 Introduction to Algorithms Lecturer: Michael Dinitz Topic: Dynamic Programming II Date: 10/12/17

CS 580: Algorithm Design and Analysis

Lecture 2: Divide and conquer and Dynamic programming

Dynamic Programming. Data Structures and Algorithms Andrei Bulatov

Copyright 2000, Kevin Wayne 1

DAA Unit- II Greedy and Dynamic Programming. By Mrs. B.A. Khivsara Asst. Professor Department of Computer Engineering SNJB s KBJ COE, Chandwad

6. DYNAMIC PROGRAMMING I

CS60007 Algorithm Design and Analysis 2018 Assignment 1

Graduate Algorithms CS F-09 Dynamic Programming

Chapter 6. Dynamic Programming. CS 350: Winter 2018

Algorithm Design and Analysis

CS Lunch. Dynamic Programming Recipe. 2 Midterm 2! Slides17 - Segmented Least Squares.key - November 16, 2016

Chapter 6. Weighted Interval Scheduling. Dynamic Programming. Algorithmic Paradigms. Dynamic Programming Applications

Algorithms Design & Analysis. Dynamic Programming

6. DYNAMIC PROGRAMMING I

Areas. ! Bioinformatics. ! Control theory. ! Information theory. ! Operations research. ! Computer science: theory, graphics, AI, systems,.

Lecture 13. More dynamic programming! Longest Common Subsequences, Knapsack, and (if time) independent sets in trees.

What is Dynamic Programming

Lecture 2: Pairwise Alignment. CG Ron Shamir

CS Analysis of Recursive Algorithms and Brute Force

CMPSCI 311: Introduction to Algorithms Second Midterm Exam

Lecture 13. More dynamic programming! Longest Common Subsequences, Knapsack, and (if time) independent sets in trees.

1 Assembly Line Scheduling in Manufacturing Sector

Dynamic Programming (CLRS )

Lecture 9. Greedy Algorithm

Introduction. I Dynamic programming is a technique for solving optimization problems. I Key element: Decompose a problem into subproblems, solve them

General Methods for Algorithm Design

Outline DP paradigm Discrete optimisation Viterbi algorithm DP: 0 1 Knapsack. Dynamic Programming. Georgy Gimel farb

Lecture 7: Dynamic Programming I: Optimal BSTs

More Dynamic Programming

Dynamic Programming: Shortest Paths and DFA to Reg Exps

Dynamic Programming. Prof. S.J. Soni

More Dynamic Programming

CS 580: Algorithm Design and Analysis

Greedy Algorithms My T. UF

Dynamic Programming ACM Seminar in Algorithmics

Dynamic Programming: Shortest Paths and DFA to Reg Exps

Today s Outline. CS 362, Lecture 13. Matrix Chain Multiplication. Paranthesizing Matrices. Matrix Multiplication. Jared Saia University of New Mexico

Quiz 1 Solutions. Problem 2. Asymptotics & Recurrences [20 points] (3 parts)

Algorithms and Theory of Computation. Lecture 9: Dynamic Programming

Dynamic Programming. Reading: CLRS Chapter 15 & Section CSE 6331: Algorithms Steve Lai

CS Data Structures and Algorithm Analysis

CSE 202 Homework 4 Matthias Springer, A

CS583 Lecture 11. Many slides here are based on D. Luebke slides. Review: Dynamic Programming

Partha Sarathi Mandal

Activity selection. Goal: Select the largest possible set of nonoverlapping (mutually compatible) activities.

INF4130: Dynamic Programming September 2, 2014 DRAFT version

Module 1: Analyzing the Efficiency of Algorithms

Dynamic Programming. p. 1/43

ACO Comprehensive Exam October 18 and 19, Analysis of Algorithms

Limitations of Algorithm Power

Question Paper Code :

Greedy Algorithms and Data Compression. Curs 2017

CMPSCI 611 Advanced Algorithms Midterm Exam Fall 2015

Algorithm Design CS 515 Fall 2015 Sample Final Exam Solutions

Introduction to Bioinformatics

Lecture 18 April 26, 2012

Advanced Analysis of Algorithms - Midterm (Solutions)

CPSC 320 (Intermediate Algorithm Design and Analysis). Summer Instructor: Dr. Lior Malka Final Examination, July 24th, 2009

Foundations of Natural Language Processing Lecture 6 Spelling correction, edit distance, and EM

CS 6901 (Applied Algorithms) Lecture 3

CS325: Analysis of Algorithms, Fall Midterm

MA008/MIIZ01 Design and Analysis of Algorithms Lecture Notes 3

Quiz 1 Solutions. (a) f 1 (n) = 8 n, f 2 (n) = , f 3 (n) = ( 3) lg n. f 2 (n), f 1 (n), f 3 (n) Solution: (b)

Dynamic Programming: Matrix chain multiplication (CLRS 15.2)

CS 470/570 Dynamic Programming. Format of Dynamic Programming algorithms:

Introduction to Divide and Conquer

Dynamic Programming. Reading: CLRS Chapter 15 & Section CSE 2331 Algorithms Steve Lai

Maximum sum contiguous subsequence Longest common subsequence Matrix chain multiplication All pair shortest path Kna. Dynamic Programming

CPSC 320 Sample Final Examination December 2013

University of New Mexico Department of Computer Science. Final Examination. CS 561 Data Structures and Algorithms Fall, 2013

This means that we can assume each list ) is

Greedy vs Dynamic Programming Approach

Chapter 6. Dynamic Programming. Slides by Kevin Wayne. Copyright 2005 Pearson-Addison Wesley. All rights reserved.

1 Maintaining a Dictionary

CSCE 750 Final Exam Answer Key Wednesday December 7, 2005

Algorithmic Approach to Counting of Certain Types m-ary Partitions

Divide-and-conquer. Curs 2015

Knapsack and Scheduling Problems. The Greedy Method

Chapter 8 Dynamic Programming

A Simple Linear Space Algorithm for Computing a Longest Common Increasing Subsequence

Determining an Optimal Parenthesization of a Matrix Chain Product using Dynamic Programming

Computational Complexity and Intractability: An Introduction to the Theory of NP. Chapter 9

Transcription:

Dynamic programming. Curs 2015

Fibonacci Recurrence. n-th Fibonacci Term INPUT: n nat QUESTION: Compute F n = F n 1 + F n 2 Recursive Fibonacci (n) if n = 0 then return 0 else if n = 1 then return 1 else (Fibonacci(n 1)+ +Fibonacci(n 2)) end if

Computing F 7. As F n+1 /F n (1 + 5)/2 1.61803 then F n > 1.6 n, and to compute F n we need 1.6 n recursive calls. F(7) F(6) F(5) F(5) F(4) F(3) F(3) F(2) F(2) F(1) F(2) F(1) F(1) F(0) F(0)F(0) F(0) F(1) F(0) F(4) F(4) F(3)

A DP algorithm. To avoid repeating multiple computations of subproblems, carry the computation bottom-up and store the partial results in a table DP-Fibonacci (n) {Construct table} F 0 = 0 F 1 = 1 for i = 1 to n do F i = F i 1 + F i 2 end for To get F n need O(n) time and O(n) space. F[0] F[1] F[2] F[3] F[4] F[5] F[6] F[7] 0 1 1 2 3 5 8 13

F(7) F(6) F(5) F(5) F(4) F(4) F(3) F(4) F(3) F(3) F(2) F(2) F(1) F(1) F(2) F(1) F(1) F(0) F(1) F(0) F(0) Recursive (top-down) approach very slow Too many identical sub-problems and lots of repeated work. Therefore, bottom-up + storing in a table. This allows us to look up for solutions of sub-problems, instead of recomputing. Which is more efficient.

Dynamic Programming. Richard Bellman: An introduction to the theory of dynamic programming RAND, 1953 Today it would be denoted Dynamic Planning Dynamic programming is a powerful technique of divide and conquer type, for efficiently computing recurrences by storing partial results and re-using them when needed. Explore the space of all possible solutions by decomposing things into subproblems, and then building up correct solutions to larger problems. Therefore, the number of subproblems can be exponential, but if the number of different problems is polynomial, we can get a polynomial solution by avoiding to repeat the computation of the same subproblem.

Properties of Dynamic Programming Dynamic Programming works when: Optimal sub-structure: An optimal solution to a problem contains optimal solutions to subproblems. Overlapping subproblems: A recursive solution contains a small number of distinct subproblems. repeated many times. Difference with greedy Greedy problems have the greedy choice property: locally optimal choices lead to globally optimal solution. For DP problems greedy choice is not possible globally optimal solution requires back-tracking through many choices.

Guideline to implement Dynamic Programming 1. Characterize the structure of an optimal solution: make sure space of subproblems is not exponential. Define variables. 2. Define recursively the value of an optimal solution: Find the correct recurrence formula, with solution to larger problem as a function of solutions of sub-problems. 3. Compute, bottom-up, the cost of a solution: using the recursive formula, tabulate solutions to smaller problems, until arriving to the value for the whole problem. 4. Construct an optimal solution: Trace-back from optimal value.

Implementtion of Dynamic Programming Memoization: technique consisting in storing the results of subproblems and returning the result when the same sub-problem occur again. Technique used to speed up computer programs. In implementing the DP recurrence using recursion could be very inefficient because solves many times the same sub-problems. But if we could manage to solve and store the solution to sub-problems without repeating the computation, that could be a clever way to use recursion + memoization. To implement memoization use any dictionary data structure, usually tables or hashing.

Implementtion of Dynamic Programming The other way to implement DP is using iterative algorithms. DP is a trade-off between time speed vs. storage space. In general, although recursive algorithms ha exactly the same running time than the iterative version, the constant factor in the O is quite more larger because the overhead of recursion. On the other hand, in general the memoization version is easier to program, more concise and more elegant. Top-down: Recursive and Bottom-up: Iterative

Weighted Activity Selection Problem Weighted Activity Selection Problem INPUT: a set S = {1, 2,..., n} of activities to be processed by a single resource. Each activity i has a start time s i and a finish time f i, with f i > s i, and a weight w i. QUESTION: Find the set of mutually compatible such that it maximizes i S w i Recall: Greedy strategy not always solved this problem. 6 10 6 1 5 10

Notation for the weighted activity selection problem We have {1, 2,..., n} activities with f 1 f 2 f n and weights {w i }. Define p(j) to be the largest integer i < j such that i and j are disjoints (p(j) = 0 if no disjoint i < j exists). Let Opt(j) be the value of the optimal solution to the problem consisting of activities in the range 1 to j. Let O j be the set of jobs in optimal solution for {1,..., j}. 1 2 3 4 5 6 1 2 3 2 1 2 p(1)=0 p(2)=0 p(3)=1 p(4)=0 p(5)=3 p(6)=3 0 1 2 3 4 5 6 7 8 9 10 11 12 13

Recurrence Consider sub-problem {1,..., j}. We have two cases: 1.- j O j : w j is part of the solution, no jobs {p(j) + 1,..., j 1} are in O j, if O p(n) is the optimal solution for {1,..., p(n)} then O j = O p(n) {j} (optimal substructure) 2.- j O j : then O j = O j 1 { 0 if j = 0 Opt(j) = max{(opt(p(j)) + w j ), Opt(j 1)} if j 1

Recursive algoritm Considering the set of activities A, we start by a pre-processing phase: sorting the activities by increasing {f i } n i=1 and computing and tabulating P[j]. The cost of the pre-computing phase is: O(n lg n + n) Therefore we assume A is sorted and all p(j) are computer and tabulated in P[1 n] R-Opt (j) if j = 0 then return 0 else return max(w j + R-Opt(p(j)), R-Opt(j 1)) end if

Recursive algorithm Opt(3) Opt(4) Opt(6) Opt(5) Opt(3) Opt(3) Opt(2) Opt(2) Opt(1) Opt(1) Opt(1) Opt(1) Opt(1) Opt(1) What is the worst running time of this algorithm?: O(2 n )

Iterative algorithm Assuming we have as input the set A of n activities sorted by increasing f, each i with s i, w i and the values of p(j) tabulated, I-Opt (n) Define a 2 n table M[] for j = 1 to n do M[j] = max(m[p[j]] + w j, M[j 1]) end for return M[n] Notice: this algorithm gives only the numerical max. weight Time complexity: O(n) (not counting the O(n lg n) pre-process)

Iterative algorithm: Example i s i f i w i P 1 1 5 1 0 2 0 8 2 0 3 7 9 2 1 4 1 11 3 0 5 9 12 1 3 6 10 13 2 3 M 0 1 2 3 3 3 5 0 1 2 3 4 5 6

Iterative algorithm: Returning the selected activities List-Sol (n) Define a 2 n table M[] for j = 1 to n do M[j] = max(m[p[j]] + w j, M[j 1]) if M[P[j]] + w j > M[j 1] then return j end if end for return M[n] In the previous example we get : 1,3,6 and value=5

The DP recursive algorithm: Memoization Notice we only have to solve a limited number of n different subproblems: from Opt(1) to Opt(n). A memoize recursive algorithm stores the solution for each sub-problem solution, using a dictionary DS. Therefore it could use tables, hashing,... In the algorithm below we use a table M[] Mem-Find-Sol (j) if j = 0 then return 0 else if M[j] then return M[j] else M[j] = max(mem-opt(p[j]) + w j, Mem-Opt(j 1)) return M[j] end if Time complexity: O(n)

The DP recursive algorithm: Memoization To get also the list of selected activities: Mem-Opt (j) if j = 0 then return 0 else if M[P[j]] + w j > M[j 1] then return j together with Mem-Find-Sol(P[j]) else return Mem-Find-Sol(j 1) end if Time complexity: O(n)

0-1 Knapsack 0-1 Knapsack INPUT:a set I = {i} n 1 of items that can NOT be fractioned, each i with weight w i and value v i. A maximum weight W permissible QUESTION: select the items to maximize the profit. Recall that we can NOT take fractions of items.

Characterize structure of optimal solution and define recurrence Need a new variable w Let v[i, w] be the maximum value (optimum) we can get from objects {1, 2,..., i} and taking a maximum weight of w (the remaining free weight). We wish to compute v[n, W ]. To compute v[i, w] we have two possibilities: That the i-th element is not part of the solution, then we go to compute v[i 1, w], or that the i-th element is part of the solution. we add v i and call This gives the recurrence, 0 if i = 0 or w = 0 v[i, j] = v[i 1, w w i ] + v i if i is part of the solution v[i 1, w] otherwise

Iterative algorithm Define a table M = v[1... n, 0... W ], Knapsack(I, W ) for i = 1 to n 1 do v[i, 0] := 0 end for for i = 1 to n do for w = 0 to W do if w i > w then v[i, w] := v[i 1, w] else v[i, w] := max{v[i 1, w], v[i 1, w w i ] + v i } end if end for end for return v[n, W ] The number of steps is O(nW ).

Example. i 1 2 3 4 5 w i 1 2 5 6 7 v i 1 6 18 22 28 W = 11. w 0 1 2 3 4 5 6 7 8 9 10 11 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 2 0 1 6 7 7 7 7 7 7 7 7 7 I 3 0 1 6 7 7 18 19 24 25 25 25 25 4 0 1 6 7 7 18 22 24 28 29 29 29 5 0 1 6 7 7 18 22 28 29 34 35 35 For instance, v[5, 11] = max{v[4, 10], v[4, 11 7] + 28} = max{7, 0 + 18} = 18.

Recovering the solution a table M = v[1... n, 0... W ], Sol-Knaps(I, W ) Initialize M Devine a list L[i, w] for every cell [i, w] for i = 1 to n do for w = 0 to W do v[i, w] := max{v[i 1, w], v[i 1, w w i ] + v i } if v[i 1, w] < v[i 1, w w i ] + v i then Add v i L[i 1, w w i ] to L[i, w] end if end for end for return v[n, W ] and the list of [i, w] Complexity: O(nW ) + cost(l[i, w]). Question: How would you implement the L[i, w] s?

Solution for previous example 0 1 2 3 4 5 6 7 8 9 10 11 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1(1) 1 1 1 1 1 1 1 1 1 2 0 1 6 7 7(1,2) 7 7 7 7 7 7 7 3 0 1 6 7 7(1,2) 18 19 24 25 25 25 25 4 0 1 6 7 7(1,2) 18 22 24 28 29 29 29 5 0 1 6 7 7 18 22 28 29 34 35 35 (1,2,5) Question: could you come with a memoized algorithm? (Hint: use a hash data structure to store solution to sub-problems)

Complexity The 0-1 Knapsack is NP-complete. Does it mean P=NP? An algorithm runs in pseudo-polynomial time if its running time is polynomial in the numerical value of the input, but it is exponential in the length of the input, Recall that given n Z the value is n but the length of the representation is lg n bits. 0-1 Knapsack, has complexity O(nW ), and its length is O(lg n + lg W ). If W = 2 n the problem is exponential its the length. However the DP algorithm works fine when W = Θ(n). Consider the unary knapsack problem, where all integers are coded in unary (7=1111111). In this case, the complexity of the DP algorithm is polynomial on the size. I.e. unary knapsack P.

Multiplying a Sequence of Matrices Multiplication of n matrices INPUT: A sequence of n matrices (A 1 A 2 A n ) QUESTION: Minimize the number of operation in the computation A 1 A 2 A n Recall that Give matrices A 1, A 2 with dim(a 1 ) = p 0 p 1 and dim(a 2 ) = p 1 p 2, the basic algorithm to A 1 A 2 takes time p 0 p 1 p 2 2 3 3 4 4 5 [ ] 2 3 4 = 3 4 5 13 18 23 18 25 32 23 32 41

Recall that matrix multiplication is NOT commutative, so we can not permute the order of the matrices without changing the result, but it is associative, so we can put parenthesis as we wish. In fact, the problem of given A 1,..., A n with dim (A i ) = p i 1 p i, how to multiply them to minimize the number of operations is equivalent to the problem of how to parenthesize the sequence A 1,... A n. Example Consider A 1 A 2 A 3, where dim (A 1 ) = 10 100 dim (A 2 ) = 100 5 and dim (A 3 ) = 5 50. ((A 1 A 2 )A 3 ) = (10 100 5) + (10 5 50) = 7500 operations, (A 1 (A 2 A 3 )) = (100 5 50) + (10 100 50) =75000 operations. The order makes a big difference in real computation s time.

How many ways to paranthesize A 1,... A n? A 1 A 2 A 3 A 4 : (A 1 (A 2 (A 3 A 4 ))), ((A 1 A 2 )(A 3 A 4 )), (((A 1 (A 2 A 3 ))A 4 ), (A 1 ((A 2 A 3 )A 4 ))), (((A 1 A 2 )A 3 )A 4 )) Let P(n) be the number of ways to paranthesize A 1,... A n. Then, { 1 if n = 1 P(n) = n 1 k=1 P(k)P(n k) si n 2 with solution P(n) = 1 n+1( 2n n ) = Ω(4 n /n 3/2 ) The Catalan numbers. Brute force will take too long!

1.- Structure of an optimal solution and recursive solution. Let A i j = (A i A i+1 A j ). The parenthesization of the subchain (A 1 A k ) within the optimal parenthesization of A 1 A n must be an optimal paranthesization of A k+1 A n. Notice, k, 1 k n, cost(a 1 n ) = cost(a 1 k ) + cost(a k+1 n ) + p 0 p k p n.

Let m[i, j] the minimum cost of A i... A j. Then, m[i, j] will be given by choosing the k, i k j s.t. minimizes m[i, k] + m[k + 1, j] + cost (A 1 k A k+1 n ). That is, { 0 if i = j m[i, j] = min 1 k j {m[i, k] + m[k + 1, j] + p i 1 p k p j } otherwise

2.- Computing the optimal costs Straightforward implementation of the previous recurrence: As dim(a i ) = p i 1 p i, the imput is given by P =< p 0, p 1,..., p n >, MCR (P, i, j) if i = j then return 0 end if m[i, j] := for k = i to j 1 do q := MCR(P, i, k) + MCR(P, k + 1, j) + p i 1 p k p j if q < m[i, j] then m[i, j] := q end if end for return m[i, j]. The time complexity if the previous is given by T (n) 2 n 1 i=1 T (i) + n Ω(2n ).

Dynamic programming approach. Use two auxiliary tables: m[1... n, 1... n] and s[1... n, 1... n]. MCP (P) for i = 1 to n do m[i, i] := 0 end for for l = 2 to n do for i = 1 to n l + 1 do j := i + l 1 m[i, j] := for k = i to j 1 do q := m[i, k] + m[k + 1, j] + p i 1 p k p j if q < m[i, j] then m[i, j] := q, s[i, j] := k end if end for end for end for return m, s. T (n) = Θ(n 3 ), and space = Θ(n 2 ).

Example. We wish to compute A 1, A 2, A 3, A 4 with P =< 3, 5, 3, 2, 4 > m[1, 1] = m[2, 2] = m[3, 3] = m[4, 4] = 0 i \ j 1 2 3 4 1 0 2 0 3 0 4 0

l = 2, i = 1, j = 2, k = 1 : q = m[1, 2] = m[1, 1] + m[2, 2] + 3.5.3 = 45 (A 1 A 2 ) s[i, 2] = 1 l = 2, i = 2, j = 3, k = 2 : q = m[2, 3] = m[2, 2] + m[3, 3] + 5.3.2 = 30 (A 2 A 3 ) s[2, 3] = 2 l = 2, i = 3, j = 4, k = 3 : q = m[3, 4] = m[3, 3] + m[4, 4] + 3.2.4 = 24 (A 3 A 4 ) s[3, 4] = 3 i \ j 1 2 3 4 1 0 45 2 1 0 30 3 2 0 24 4 3 0

l = 3, i = 1, j = 3 : { (k = 1)m[1, 1] + m[2, 3] + 3.5.2 = 60 A 1 (A 2 A 3 ) m[1, 3] = min (k = 2)m[1, 2] + m[3, 3] + 3.3.2 = 63 (A 1 A 2 )A 3 s[1, 3] = 1, l = 3, i = 2, j = 4 : m[2, 4] = min s[2, 4] = 3 { (k = 2)m[2, 2] + m[3, 4] + 5.3.4 = 84 A 2 (A 3 A 4 ), (k = 3)m[2, 3] + m[4, 4] + 5.2.4 = 70 (A 2 A 3 )A 4. i \ j 1 2 3 4 1 0 45 60 2 1 0 30 70 3 1 2 0 24 4 3 3 0

l = 4, i = 1, j = 4 : (k = 1)m[1, 1] + m[2, 4] + 3.5.4 = 130 A 1 (A 2 A 3 A 4 ), m[1, 4] = min (k = 2)m[1, 2] + m[3, 4] + 3.3.4 = 105 (A 1 A 2 )(A 3 A 4 ), (k = 3)m[1, 3] + m[4, 4] + 3.2.4 = 84 (A 1 A 2 A 3 )A 4. i \ j 1 2 3 4 1 0 45 60 84 2 1 0 30 70 3 1 2 0 24 4 3 3 3 0

3.- Constructing an optimal solution We need to construct an optimal solution from the information in s[1,..., n, 1,..., n]. In the table, s[i, j] contains k such that the optimal way to multiply: A i A j = (A i A k )(A k+1 A j ). Moreover, s[i, s[i, j]] determines the k to get A i s[i,j] and s[s[i, j] + 1, j] determines the k to get A s[i,j]+1 j. Therefore, A 1 n = A 1 s[1,n] A s[1,n]+1 n. Multiplication(A, s, i, j) if j > 1 then X :=Multiplication (A, s, i, s[i, j]) Y :=Multiplication (A, s, s[i, j] + 1, j) return X Y else return A i end if Therefore (A 1 (A 2 A 3 ))A 4.

Evolution DNA T A C A G T A C G Mutation T A C A C T A C G Delete T C A G A C G T C A G A C G Insertion A T C A G A C G

Sequence alignment problem T A C A G T A C G? A T C A G A C G

Formalizing the problem Longest common substring: Substring = chain of characters without gaps. T C A T G T A G A C T A T C A G A Longest common subsequence: Subsequence = ordered chain of characters with gaps. T C A T G T A G A C T A T C A G A Edit distance: Convert one string into another one using a given set of operations. T A C A G T A C G A T C A G A C G?

String similarity problem: The Longest Common Subsequence LCS INPUT: sequences X =< x 1 x m > and Y =< y 1 y n > QUESTION: Compute the longest common subsequence. A sequence Z =< z 1 z k > is a subsequence of X if there is a subsequence of integers 1 i 1 < i 2 <... < i k m such that z j = x ij. If Z is a subsequence of X and Y, the Z is a common subsequence of X and Y. Given X = ATATAT, then TTT is a subsequence of X

Greedy approach LCS: Given sequences X =< x 1 x m > and Y =< y 1 y n >. Compute the longest common subsequence. Greedy X, Y S := for i = 1 to m do for j = i to n do if x i = y j then S := S {x i } end if let y l such that l = min{a > j x i = y a} let x k such that k = min{a > i x i = y a} if i, l < k then do S := S {x i }, i := i + 1; j := l + 1 S := S {x k }, i := k + 1; j := j + 1 else if not such y l, x k then do i := i + 1 and j := j + 1. end if end for end for

Greedy approach LCS: Given sequences X =< x 1 x m > and Y =< y 1 y n >. Compute the longest common subsequence. Greedy X, Y S := for i = 1 to m do for j = i to n do if x i = y j then S := S {x i } end if let y l such that l = min{a > j x i = y a} let x k such that k = min{a > i x i = y a} if i, l < k then do S := S {x i }, i := i + 1; j := l + 1 S := S {x k }, i := k + 1; j := j + 1 else if not such y l, x k then do i := i + 1 and j := j + 1. end if end for end for Greedy approach do not work For X =A T C A C and Y =C G C A C A C A C T the result of greedy is A T but the solution is A C A C.

Dynamic Programming approach Characterization of optimal solution and recurrence Let X =< x 1 x n > and Y =< y 1 y m >. Let X [i] =< x 1 x i > and Y [i] =< y 1 y j >. Define c[i, j] = length de la LCS of X [i] and Y [j]. Want c[n, m] i.e. solution LCS X and Y What is a subproblem?

Characterization of optimal solution and recurrence Subproblem = something that goes part of the way in converting one string into other. Given X =C G A T C and Y =A T A C c[5, 4] = c[4, 3] + 1 If X =C G A T and Y =A T A to find c[4, 3]: either LCS of C G A T and A T or LCS of C G A and A T A c[4, 3] = max(c[3, 3], c[4, 2]) Given X and Y { c[i 1, j 1] + 1 if x i = y j c[i, j] = max(c[i, j 1], c[i 1, j]) otherwise

c[i, j] = { c[i 1, j 1] + 1 max(c[i, j 1], c[i 1, j]) if x i = y j otherwise c[3,2] c[3,1] c[2,2] c[2,1] c[3,0] c[2,1] c[2,0] c[2,1] c[1,2] c[1,1] c[2,0] c[1,1] c[1,0] c[1,1] c[0,2] c[0,1] c[1,0] c[0,1] c[0,0]

The direct top-down implementation of the recurrence LCS (X, Y ) if m = 0 or n = 0 then return 0 else if x m = y n then return 1+LCS (x 1 x m 1, y 1 y n 1 ) else return max{lcs (x 1 x m 1, y 1 y n ) end if LCS (x 1 x m, y 1 y n 1 )} The algorithm explores a tree of depth Θ(n + m), therefore the time complexity is T (n) = 3 Θ(n+m).

Bottom-up solution Avoid the exponential running time, by tabulating the subproblems and not repeating their computation. To memoize the values c[i, j] we use a table c[0 n, 0 m] Starting from c[0, j] = 0 for 0 j m and from c[i, 0] = 0 from 0 i n go filling row-by-row, left-to-right, all c[i, j] j-1 j i-1 i c[i-1,j-1] c[i-1,j] c[i,j-1] c[i,j] Use a field d[i, j] inside c[i, j] to indicate from where we use the solution.

Bottom-up solution LCS (X, Y ) for i = 1 to n do c[i, 0] := 0 end for for j = 1 to m do c[0, j] := 0 end for for i = 1 to n do for j = 1 to m do if x i = y j then c[i, j] := c[i 1, j 1] + 1, b[i.j] := else if c[i 1, j] c[i, j 1] then c[i, j] := c[i 1, j], b[i, j] := else c[i, j] := c[i, j 1], b[i, j] :=. end if end for end for Time and space complexity T = O(nm).

Example. X=(ATCTGAT); Y=(TGCATA). Therefore, m = 6, n = 7 0 1 2 3 4 5 6 T G C A T A 0 0 0 0 0 0 0 0 1 A 0 0 0 0 1 1 1 2 T 0 1 1 1 1 2 2 3 C 0 1 1 2 2 2 2 4 T 0 1 1 2 2 3 3 5 G 0 1 2 2 2 3 3 6 A 0 1 2 2 3 3 4 7 T 0 1 2 2 3 4 4

Construct the solution Uses as input the table c[n, m]. The first call to the algorithm is con-lcs (c, n, m) con-lcs (c, i, j) if i = 0 or j = 0 then STOP. else if b[i, j] = then con-lcs (c, i 1, j 1) return x i else if b[i, j] = then con-lcs (c, i 1, j) else con-lcs (c, i, j 1) end if The algorithm has time complexity O(n + m).

Edit Distance. Generalization of LCS The edit distance between strings X = x 1 x n and Y = y 1 y m is defined to be the minimum number of edit operations needed to transform X into Y, where the set of edit operations is: insert(x, i, a) = x 1 x i ax i+1 x n. delete(x, i) = x 1 x i 1 x i+1 x n modify(x, i, a) = x 1 x i 1 ax i+1 x n. Example: x = aabab and y = babb aabab = X X =insert(x, 0, b) baabab X =delete(x, 2) babab Y =delete(x, 4) babb

A shorter distance. X = aabab Y = babb aabab = X X =modify(x, 1, b) babab Y =delete(x, 4) babb Use dynamic programming.

1.- Characterize the structure of an optimal solution and set the recurrence. Assume want to find the edit distance from X = TATGCAAGTA to Y = CAGTAGTC Consider the prefixes TATGCA and CAGT Let E[6, 4] = edit distance between TATGCA and CAGT Distance between TATGCA and CAGT is E[5, 4] + 1 (delete A) Distance between TATGCA and CAGT is E[6, 5] + 1 (add A) Distance between TATGCA and CAGTA is E[5, 4] (keep last A and compare TATGC and CAGT ).

To compute the edit distance from X = x 1 x n to Y = y 1 y m : Let X [i] = x 1 x i and Y [j] = y 1 y j let E[i, j] = edit distance from X [i] to Y [j] If x i y j the last step from X [i] Y [j] must be one of: 1. put y j at the end x: x x 1 x i y j, and then transform x 1 x i into y 1 y j 1. E[i, j] = E[i, j 1] + 1 2. delete x i : x x 1 x i 1, and then transform x 1 x i 1 into y 1 y j. E[i, j] = E[i 1, j] + 1 3. change x i into y j : x x 1 x n 1 y m, and then transform x 1 x i 1 into y 1 y j 1 E[i, j] = E[i 1, j 1] + 1

Moreover, E[0, j] = j (converting λ Y [j]) E[i, 0] = j (converting X [i] λ) Therefore, we have the recurrence i E[i, j] = j min{e[i 1, j] + 1, E[i, j 1] + 1, E[i 1, j 1] + d(x i, y j )} where d(x i, y j ) = { 0 if x i = y j 1 otherwise

2.- Computing the optimal costs. Edit X = {x 1,..., x n}, Y = {y 1,..., y n} for i = 0 to n do E[i, 0] := i end for for j = 0 to m do E[0, j] := j end for for i = 1 to n do for j = 1 to m do if x i = y j then d(x i, y j ) = 0 else d(x i, y j ) = 1 end if E[i, j] := E[i, j 1] + 1 if E[i 1, j 1] + d(x i, y j ) < E[i, j] then E[i, j] := E[i 1, j 1] + d(x i, y j ), b[i, j] := else if E[i 1, j] + 1 < E[i, j] then E[i, j] := E[i 1, j] + 1, b[i, j] := else b[i, j] := end if end for end for Time and space complexity T = O(nm). Example: X=aabab; Y=babb. Therefore, n = 5, m = 4 0 1 2 3 4 λ b a b b 0 λ 0 1 2 3 4 1 a 1 1 1 2 3 2 a 2 2 1 2 3 3 b 3 2 2 1 2 4 a 4 3 2 2 2 5 b 5 4 3 2 2

3.- Construct the solution. Uses as input the table E[n, m]. The first call to the algorithm is con-edit (E, n, m) con-edit (E, i, j) if i = 0 or j = 0 then STOP. else if b[i, j] = and x i = y j then change(x, i, y j ) con-edit (E, i 1, j 1) else if b[i, j] = then delete(x, i), con-edit (c, i 1, j) else insert(x, i, y j ), con-edit (c, i, j 1) end if This algorithm has time complexity O(nm).

Sequence Alignment. Finding similarities between sequences is important in Bioinformatics For example, Locate similar subsequences in DNA Locate DNA which may overlap. Similar sequences evolved from common ancestor Evolution modified sequences by mutations Replacement. Deletions. Insertions.

Sequence Alignment. Given two sequences over same alphabet G C G C A T G G A T T G A G C G A T G C G C C A T T G A T G A C C A An alignment - GCGC- ATGGATTGAGCGA TGCGCCATTGAT -GACC- A Alignments consist of: Perfect matchings. Mismatches. Insertion and deletions. There are many alignments of two sequences. Which is better?

To compare alignments define a scoring function: +1 if the ith pair matches s(i) = 1 if the ith mismatches 2 if the ith pair InDel Score alignment = i s(i) Better = max. score between all alignments of two sequences. Very similar to LCS, but with weights.

Typesetting justification. We have a text T = w 1, w 2,..., w n Given we have a width of line = M, the goal is to place the line breaks causing the minimum of stretching (present an aesthetic look).

Typesetting justification Typesetting INPUT: a text w 1, w 2,..., w n and width M QUESTION: Compute the line breaks j 1, j 2,..., j l that minimizes the cost function of stretching. The DP we explain here is very similar to that LaTex software for doing typesetting justification.

Greedy approach Fill each line as much as possible before going to next line. abcd, abcd, abcd, abcd abcd i ab abracadabraarbadacabra abcd, abcd, abcd abcd, abcd i ab abracadabraarbadacabra

Greedy approach Fill each line as much as possible before going to next line. abcd, abcd, abcd, abcd abcd i ab abracadabraarbadacabra abcd, abcd, abcd abcd, abcd i ab abracadabraarbadacabra DP solution If average number of words is 10 per line and there are n words the number of possible solutions is ( ) n = 2 Ω(n). n/10 Key: once we break each line it breaks the paragraph into two parts that can be optimized independently.

Characterize optimal solution. We have l + 1 lines in a page, and let j 1, j 2,..., j l be the line breaks, so at the j i -th line we have w ji 1 +1,..., w ji. Let E[i, j] be the extra-space of putting w i,..., w j in one line. Then j E[i, j] = M (j i) w k. Let c[i, j] be the cost of putting w i,..., w j in one line. Then if M E[i, j] < 0 c[i, j] = 0 if j = n & M E[i, j] 0 E[i, j] 3 otherwise Want to minimize the sum of c over all lines. Consider an optimal arrangement of words 1,..., j, where 1 j n. If we have l + 1 lines consider the line from word i = j l 1 + 1 to word j l. The proceedings words 1 to j l 1 must be break in an optimal way k=i

Recursive definition. Let OC[j] the optimal cost of the (optimal) arrangement of words 1,..., j If we know the last line in those words contains i,..., j we get the recurrence: OC[j] = OC[i 1] + c[i, j]. So, OC[j] = { 0 if j = 0, min 1 i j OC[i 1] + c[i, j] if j > 0. We apply DP to compute OC[n].

Algorithm to compute the solution. Justify { w 1 } n i=1, n, M for i = 1 to n do E[i, i] := M w i for j = i + 1 to n do E[i, j] := E[i, j 1] w j 1 end for end for for i = 1 to n do for j = i to n do if E[i, j] < 0 then c[i, j] := else if j = n and E[i, j] 0 then c[i, j] := 0 else c[i, j] := (E[i, j]) 3 end if end for end for c[0] := 0 for j = 1 to n do c[j] := for i = 1 to j do if c[i 1] + OC[i, j] < c[j] then c[j] := c[i 1] + OC[i, j] p[j] := i end if end for end for print c, p Define n n table: for empty space per line E[i, j] cost from w i to w j in one line: c[i, j] Define n + 1 array of optimal costs:oc[i] Define n array of pointers indicating optimal breaking of lines l i : p[i] Complexity O(n 2 ).

Example. Consider w 1 = 2, w 2 = 4, w 3 = 5, w 4 = 1, w 5 = 4, w 6 = 1, w 7 = 2, w 8 = 4, w 9 = 3, w 10 = 5, w 11 = 2, w 12 = 4 with M = 20. The table of extra space E = M j + i w k : E 1 2 3 4 5 6 7 8 9 10 11 12 1 18 13 7 5 0-2 2 16 10 8 3 1-2 3 15 13 8 6 3-2 4 19 14 12 9 4 0-6 5 16 14 11 6 2-4 6 19 16 11 7 1-2 7 18 13 9 3 0-5 8 16 12 6 3-1 9 17 11 8 4 10 15 12 7 11 18 13 12 16

Example. The table of costs c[i, j] c 1 2 3 4 5 6 7 8 9 10 11 12 1 5832 2197 343 125 0 0 2 4096 1000 512 27 1 0 3 3375 2197 512 216 27 0 4 6859 2744 1728 729 64 0 0 5 4096 2744 1331 216 8 0 6 6859 4096 1331 343 1 0 7 5832 2197 729 27 0 0 8 4096 1728 216 27 0 9 4913 1331 512 64 10 3375 1728 343 11 5832 2197 12 4096

Optimal cost array of pointers and Typesetting The optimal cost array OC[i, j] 0 1 2 3 4 5 6 7 8 9 10 11 12 0 5832 2197 343 125 0 6859 1072 341 8 1 853 351 The array of pointers p[i] 1 2 3 4 5 6 7 8 9 10 11 12 1 1 1 1 1 4 4 5 5 5 9 10 p[12] = 10, p[p[12]] = 5, p[p[p[12]]] = 1 w 1 w 2 w 3 w 4 w 5 w 6 w 7 w 8 w 9 w 10 +1 w 11 w 12

Dynamic Programming in Trees Trees are nice graphs to bound the number of subproblems. Given T = (V, A) with V = n, recall that there are n subtrees in T. Therefore, when considering problems defined on trees, it is easy to bound the number of subproblems This allows to use Dynamic Programming to give polynomial solutions to difficult graph problems when the input is a tree.

The Maximum Weight Independent Set (MWIS). INPUT: G = (V, E), together with a weight w : V R QUESTION: Find the largest S V such that no two vertices in S are connected in G. For general G, the problem is difficult, as the case with all weights =1 is already NP-complete. 5 1 1 2 2 2 6 Given a rooted tree T = (V, A) as instance for the MWIS. is rooted. Then v V, v defines a subtree T v. 6 a 4 b 8 c 8 d 8 e f g h i 5 6 2 3 j 9 k 7 l m n o 2 5 4 6

Characterization of the optimal solution Key observation: An WIS S in T can t contain vertices which are father-son. For v V, let T v be the subtree rooted at v and let S v be the size of the MWIS in T v. Define: M(v) = max{w(s v ) v S v } & M (v) = max{w(s v ) v S}. M(v) and M (v) are the max weights of the independent sets in T v that contain v and not contain v Recursive definition of the optimal solution For v V and u a son of v (in T v ): M(v) = w(v) + u M (u) and M (v) = w(v) + u max{m(u), M (u)} In the case v is a leaf M(v) = w(v) and M (v) = 0

Algorithm to find MWIS on a rooted tree T with size n. Define 2 n n tables to store the values of M and M. The optimal solution will be given by the following procedure that expres T first bottom-up and after top-down: 1. For every v V compute M(v) and M (v) 1.1 If v is a leaf M(v) := w(v), M (v) := 0 1.2 Otherwise for u a son of v, M(v) := w(v) + v M (u), M (v) := u max{m(u), M (u)} 2. In a top-dow manner, do 2.1 S = 2.2 for root r, if M(r) > M (r), then S := S {r} 2.3 for u r, if v S and M(u) > M (u) then S := S {r} 3. return S

Bottom-up M(l) = 8, M(n) = 4, M(n) = 6, M(e) = 5 M(f ) = 6, M(o) = 2, M(k) = 7 M(b) = 4, M (b) = 11 M(h) = 8, M (h) = 15 M(j) = 9, M (h) = 2 M(d) = 10, M (d) = 16 M(c) = 23, M (c) = 20 M(a) = 6 + M (b) + M (c) + M (d) = 53 M (a) = 6 + M (b) + M(c) + M (d) = 50 6 a 4 b 8 c 8 d 8 e f g h i 5 6 2 3 j 9 k 7 l m n o 2 5 4 6

Top down M(l) = 8, M(n) = 4, M(n) = 6, M(e) = 5 M(f ) = 6, M(o) = 2, M(k) = 7 M(b) = 4, M (b) = 11 M(h) = 8, M (h) = 15 M(j) = 9, M (h) = 2 M(d) = 10, M (d) = 16 M(c) = 23, M (c) = 20 M(a) = 6 + M (b) + M (c) + M (d) = 53 M (a) = 6 + M (b) + M(c) + M (d) = 50 Maximum Weighted Independent Set: S = {a, e, f, g, i, j, k, l, m, n} w(s) = 53. 6 a 4 b 8 c 8 d 8 e f g h i 5 6 2 3 j 9 k 7 l m n o 2 5 4 6

Complexity. Space complexity: 2n 2 Time complexity: Step 1 To update M and M we only need to look at the sons of the vertex into consideration. As we cover all n vertices, O(n) Step 2 From the root down to the leaves, for each vertex v compare M(v) with M (v), if M(v) > M (v) include v in S, otherwise do not include. Θ(n) As we have to consider all the vertices at least one, we have a lower bound in the time complexity of Ω(n), therefore the total number of steps is Θ(n).