Dynamic Programming Algorithms Explained
Dynamic Programming Algorithms Explained
Algorithm types
• Paradigms:
➢ Divide and conquer
➢ Greedy Algorithm
➢ Dynamic programming
Dynamic programming
• Matrix Multiplicatiom
Longest Common Subsequence (LCS)
• DNA analysis, two DNA string comparison.
• DNA string: a sequence of symbols A,C,G,T.
➢ S=ACCGGTCGAGCTTCGAAT
13
LCS DP –step 2:Recursive Solution
• First we’ll find the length of LCS. Later we’ll modify the
algorithm to find LCS itself.
• Define Xi, Yj to be the prefixes of X and Y of length i and j
respectively
• Define c[i,j] to be the length of LCS of Xi and Yj
• Then the length of LCS of X and Y will be c[m,n]
c[i − 1, j − 1] + 1 if x[i] = y[ j ],
c[i, j ] =
max( c[i, j − 1], c[i − 1, j ]) otherwise
LCS recursive solution
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 − 1, j − 1] + 1 if x[i] = y[ j ],
c[i, j ] =
max( c[i, j − 1], c[i − 1, j ]) otherwise
c[i − 1, j − 1] + 1 if x[i] = y[ j ],
c[i, j ] =
max( c[i, j − 1], c[i − 1, j ]) otherwise
0 Xi
A
1
2 B
3 C
4 B
X = ABCB; m = |X| = 4
ABCB
Y = BDCAB; n = |Y| = 5
BDCAB
Allocate array c[5,4]
ABCB
j 0 1 2 3 4 5
BDCAB
i Yj B D C A B
0 Xi
0 0 0 0 0 0
A
1 0
2 B
0
3 C 0
4 B 0
for i = 1 to m c[i,0] = 0
for j = 1 to n c[0,j] = 0
ABCB
j 0 1 2 3 4 5
BDCAB
i Yj B D C A B
0 Xi
0 0 0 0 0 0
A
1 0 0
2 B
0
3 C 0
4 B 0
if ( Xi == Yj )
c[i,j] = c[i-1,j-1] + 1
else c[i,j] = max( c[i-1,j], c[i,j-1] )
ABCB
j 0 1 2 3 4 5
BDCAB
i Yj B D C A B
0 Xi
0 0 0 0 0 0
A
1 0 0 0 0
2 B
0
3 C 0
4 B 0
if ( Xi == Yj )
c[i,j] = c[i-1,j-1] + 1
else c[i,j] = max( c[i-1,j], c[i,j-1] )
ABCB
j 0 1 2 3 4 5
BDCAB
i Yj B D C A B
0 Xi
0 0 0 0 0 0
A
1 0 0 0 0 1
2 B
0
3 C 0
4 B 0
if ( Xi == Yj )
c[i,j] = c[i-1,j-1] + 1
else c[i,j] = max( c[i-1,j], c[i,j-1] )
ABCB
j 0 1 2 3 4 5
BDCAB
i Yj B D C A B
0 Xi
0 0 0 0 0 0
A
1 0 0 0 0 1 1
2 B
0
3 C 0
4 B 0
if ( Xi == Yj )
c[i,j] = c[i-1,j-1] + 1
else c[i,j] = max( c[i-1,j], c[i,j-1] )
ABCB
j 0 1 2 3 4 5
BDCAB
i Yj B D C A B
0 Xi
0 0 0 0 0 0
A
1 0 0 0 0 1 1
2 B
0 1
3 C 0
4 B 0
if ( Xi == Yj )
c[i,j] = c[i-1,j-1] + 1
else c[i,j] = max( c[i-1,j], c[i,j-1] )
ABCB
j 0 1 2 3 4 5
BDCAB
i Yj B D C A B
0 Xi
0 0 0 0 0 0
A
1 0 0 0 0 1 1
2 B
0 1 1 1 1
3 C 0
4 B 0
if ( Xi == Yj )
c[i,j] = c[i-1,j-1] + 1
else c[i,j] = max( c[i-1,j], c[i,j-1] )
ABCB
j 0 1 2 3 4 5
BDCAB
i Yj B D C A B
0 Xi
0 0 0 0 0 0
A
1 0 0 0 0 1 1
2 B
0 1 1 1 1 2
3 C 0
4 B 0
if ( Xi == Yj )
c[i,j] = c[i-1,j-1] + 1
else c[i,j] = max( c[i-1,j], c[i,j-1] )
ABCB
j 0 1 2 3 4 5
BDCAB
i Yj B D C A B
0 Xi
0 0 0 0 0 0
A
1 0 0 0 0 1 1
2 B
0 1 1 1 1 2
3 C 0 1 1
4 B 0
if ( Xi == Yj )
c[i,j] = c[i-1,j-1] + 1
else c[i,j] = max( c[i-1,j], c[i,j-1] )
ABCB
j 0 1 2 3 4 5
BDCAB
i Yj B D C A B
0 Xi
0 0 0 0 0 0
A
1 0 0 0 0 1 1
2 B
0 1 1 1 1 2
3 C 0 1 1 2
4 B 0
if ( Xi == Yj )
c[i,j] = c[i-1,j-1] + 1
else c[i,j] = max( c[i-1,j], c[i,j-1] )
ABCB
j 0 1 2 3 4 5
BDCAB
i Yj B D C A B
0 Xi
0 0 0 0 0 0
A
1 0 0 0 0 1 1
2 B
0 1 1 1 1 2
3 C 0 1 1 2 2 2
4 B 0
if ( Xi == Yj )
c[i,j] = c[i-1,j-1] + 1
else c[i,j] = max( c[i-1,j], c[i,j-1] )
ABCB
j 0 1 2 3 4 5 BDCAB
i Yj B D C A B
0 Xi
0 0 0 0 0 0
A
1 0 0 0 0 1 1
2 B
0 1 1 1 1 2
3 C 0 1 1 2 2 2
4 B 0 1
if ( Xi == Yj )
c[i,j] = c[i-1,j-1] + 1
else c[i,j] = max( c[i-1,j], c[i,j-1] )
ABCB
j 0 1 2 3 4 5 BDCAB
i Yj B D C A B
0 Xi
0 0 0 0 0 0
A
1 0 0 0 0 1 1
2 B
0 1 1 1 1 2
3 C 0 1 1 2 2 2
4 B 0 1 1 2 2
if ( Xi == Yj )
c[i,j] = c[i-1,j-1] + 1
else c[i,j] = max( c[i-1,j], c[i,j-1] )
ABCB
j 0 1 2 3 4 5 BDCAB
i Yj B D C A B
0 Xi
0 0 0 0 0 0
A
1 0 0 0 0 1 1
2 B
0 1 1 1 1 2
3 C 0 1 1 2 2 2
4 B 0 1 1 2 2 3
if ( Xi == Yj )
c[i,j] = c[i-1,j-1] + 1
else c[i,j] = max( c[i-1,j], c[i,j-1] )
LCS Length Algorithm
LCS-Length(X, Y)
1. m = length(X) // get the # of symbols in X
2. n = length(Y) // get the # of symbols in Y
3. for i = 1 to m c[i,0] = 0 // special case: Y0
4. for j = 1 to n c[0,j] = 0 // special case: X0
5. for i = 1 to m // for all Xi
6. for j = 1 to n // for all Yj
7. if ( Xi == Yj )
8. c[i,j] = c[i-1,j-1] + 1
9. else c[i,j] = max( c[i-1,j], c[i,j-1] )
10. return c
LCS Algorithm Running Time
• So far, we have just found the length of LCS, but not LCS
itself.
• We want to modify this algorithm to make it output Longest
Common Subsequence of X and Y
Each c[i,j] depends on c[i-1,j] and c[i,j-1]
or c[i-1, j-1]
For each c[i,j] we can say how it was acquired:
0 Xi
0 0 0 0 0 0
A
1 0 0 0 0 1 1
2 B
0 1 1 1 1 2
3 C 0 1 1 2 2 2
4 B 0 1 1 2 2 3
Finding LCS (2)
j 0 1 2 3 4 5
i Yj B D C A B
0 Xi
0 0 0 0 0 0
A
1 0 0 0 0 1 1
2 B
0 1 1 1 1 2
3 C 0 1 1 2 2 2
4 B 0 1 1 2 2 3
LCS (reversed order): B C B
Dynamic programming
0-1 Knapsack problem
Review: Dynamic programming
4 5
Max weight: W = 20
5 8
W = 20
9 10
0-1 Knapsack problem
max bi subject to w W i
iT iT
O(n*W)
Remember that the brute-force algorithm
takes O(2n)
Example
n = 4 (# of elements)
W = 5 (max weight)
Elements (weight, benefit):
(2,3), (3,4), (4,5), (5,6)
Example (2)
i 0 1 2 3 4
W
0 0
1 0
2 0
3 0
4 0
5 0
for w = 0 to W
B[0,w] = 0
Example (3)
i 0 1 2 3 4
W
0 0 0 0 0 0
1 0
2 0
3 0
4 0
5 0
for i = 0 to n
B[i,0] = 0
Example (4) Items:
i
W
0 1 2 3 4 1: (2,3)
0 0 0 0 0 0
2: (3,4)
1 0 0
i=1
2 0 bi=3 3: (4,5)
3 0
wi=2 4: (5,6)
4 0
w=1
5 0
w-wi =-1
if wi <= w // item i can be part of the solution
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
else B[i,w] = B[i-1,w] // wi > w
Example (5) Items:
i 0 1 2 3 4 1: (2,3)
W
0 0 0 0 0 0 2: (3,4)
i=1
1 0 0 3: (4,5)
2 0 3 bi=3 4: (5,6)
3 0
wi=2
4 0
w=2
5 0
w-wi=0
if wi <= w // item i can be part of the solution
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
else B[i,w] = B[i-1,w] // wi > w
Example (6) Items:
i
W
0 1 2 3 4 1: (2,3)
0 0 0 0 0 0
2: (3,4)
1 0 0
i=1
2 0 3 bi=3 3: (4,5)
3 0 3
wi=2 4: (5,6)
4 0
w=3
5 0
w-wi=1
if wi <= w // item i can be part of the solution
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
else B[i,w] = B[i-1,w] // wi > w
Example (7) Items:
i
W
0 1 2 3 4 1: (2,3)
0 0 0 0 0 0
2: (3,4)
1 0 0
i=1
2 0 3 bi=3 3: (4,5)
3 0 3
wi=2 4: (5,6)
4 0 3
w=4
5 0
w-wi=2
if wi <= w // item i can be part of the solution
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
else B[i,w] = B[i-1,w] // wi > w
Example (8) Items:
i 0 1 2 3 4 1: (2,3)
W
0 0 0 0 0 0 2: (3,4)
i=1
1 0 0 3: (4,5)
2 0 3 bi=3 4: (5,6)
3 0 3
wi=2
4 0 3
w=5
5 0 3
w-wi=2
if wi <= w // item i can be part of the solution
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
else B[i,w] = B[i-1,w] // wi > w
Example (9) Items:
i
W
0 1 2 3 4 1: (2,3)
0 0 0 0 0 0
2: (3,4)
1 0 0 0 i=2
2 0 3
3: (4,5)
bi=4
3 0 3 4: (5,6)
4 0 3 wi=3
5 0 3
w=1
if wi <= w // item i can be part of the solution
w-wi=-2
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
else B[i,w] = B[i-1,w] // wi > w
Example (10) Items:
i
W
0 1 2 3 4 1: (2,3)
0 0 0 0 0 0
2: (3,4)
1 0 0 0 i=2
2 0 3 3
3: (4,5)
bi=4
3 0 3 4: (5,6)
4 0 3 wi=3
5 0 3
w=2
if wi <= w // item i can be part of the solution
w-wi=-1
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
else B[i,w] = B[i-1,w] // wi > w
Example (11) Items:
i
W
0 1 2 3 4 1: (2,3)
0 0 0 0 0 0
2: (3,4)
1 0 0 0 i=2
2 0 3 3
3: (4,5)
bi=4
3 0 3 4 4: (5,6)
4 0 3 wi=3
5 0 3
w=3
if wi <= w // item i can be part of the solution
w-wi=0
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
else B[i,w] = B[i-1,w] // wi > w
Example (12) Items:
i
W
0 1 2 3 4 1: (2,3)
0 0 0 0 0 0
2: (3,4)
1 0 0 0 i=2
2 0 3 3
3: (4,5)
bi=4
3 0 3 4 4: (5,6)
4 0 3 4 wi=3
5 0 3
w=4
if wi <= w // item i can be part of the solution
w-wi=1
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
else B[i,w] = B[i-1,w] // wi > w
Example (13) Items:
i
W
0 1 2 3 4 1: (2,3)
0 0 0 0 0 0
2: (3,4)
1 0 0 0 i=2
2 0 3 3
3: (4,5)
bi=4
3 0 3 4 4: (5,6)
4 0 3 4 wi=3
5 0 3 7
w=5
if wi <= w // item i can be part of the solution
w-wi=2
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
else B[i,w] = B[i-1,w] // wi > w
Example (14) Items:
i
W
0 1 2 3 4 1: (2,3)
0 0 0 0 0 0
2: (3,4)
1 0 0 0 0 i=3
2 0 3 3 3
3: (4,5)
bi=5
3 0 3 4 4 4: (5,6)
4 0 3 4 wi=4
5 0 3 7
w=1..3
if wi <= w // item i can be part of the solution
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
else B[i,w] = B[i-1,w] // wi > w
Example (15) Items:
i
W
0 1 2 3 4 1: (2,3)
0 0 0 0 0 0
2: (3,4)
1 0 0 0 0 i=3
2 0 3 3 3
3: (4,5)
bi=5
3 0 3 4 4 4: (5,6)
4 0 3 4 5 wi=4
5 0 3 7
w=4
if wi <= w // item i can be part of the solution
w- wi=0
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
else B[i,w] = B[i-1,w] // wi > w
Example (15) Items:
i
W
0 1 2 3 4 1: (2,3)
0 0 0 0 0 0
2: (3,4)
1 0 0 0 0 i=3
2 0 3 3 3
3: (4,5)
bi=5
3 0 3 4 4 4: (5,6)
4 0 3 4 5 wi=4
5 0 3 7 7
w=5
if wi <= w // item i can be part of the solution
w- wi=1
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
else B[i,w] = B[i-1,w] // wi > w
Example (16) Items:
i
W
0 1 2 3 4 1: (2,3)
0 0 0 0 0 0
2: (3,4)
1 0 0 0 0 0 i=3
2 0 3 3 3 3
3: (4,5)
bi=5
3 0 3 4 4 4 4: (5,6)
4 0 3 4 5 5 wi=4
5 0 3 7 7
w=1..4
if wi <= w // item i can be part of the solution
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
else B[i,w] = B[i-1,w] // wi > w
Example (17) Items:
i
W
0 1 2 3 4 1: (2,3)
0 0 0 0 0 0
2: (3,4)
1 0 0 0 0 0 i=3
2 0 3 3 3 3
3: (4,5)
bi=5
3 0 3 4 4 4 4: (5,6)
4 0 3 4 5 5 wi=4
5 0 3 7 7 7
w=5
if wi <= w // item i can be part of the solution
if bi + B[i-1,w-wi] > B[i-1,w]
B[i,w] = bi + B[i-1,w- wi]
else
B[i,w] = B[i-1,w]
else B[i,w] = B[i-1,w] // wi > w
Comments