4x1

Dynamic Programming
• General algorithmic technique
• Can be used when the problem have “optimal substructure”: solution can be constructed from optimal solutions to subproblems.
use dynamic programming when subproblems overlap.
Dynamic Programming
• Today and next week: 4 examples
• Rod cutting
• Longest common subsequence
CLRS chapter 15.0, 15.1, 15.4.
• All pairs shortest path (next week)
• Sequence alignment (next week)
Rod cutting
Rod cutting: Recursive solution
• Rod cutting problem: Cut a steel rod into pieces in order to maximize revenue. Cuts
are free and each length has a revenue/price.
rn =
(
0
maxi=1...n (pi + rn i )
if n = 0
otherwise
4
X2
3
X1
2
time O(2^n)
1
XX0
X0
X0
X1
X1
X0
X0
X0
X0
0
Avoid recomputation?
Rod cutting: Recursion + memoization
Rod cutting: bottom-up
4
3
2
1
0
• Running time Ɵ(n2): • running time Ɵ(n2).
• each subproblem solved once, • Space Ɵ(n)
• time to solve a subproblem of size j: for loop iterates j times.
• Space: Ɵ(n)
Rod cutting: reconstruction solution
11
22
33
44
55
66
77
88
rr
11
55
88
10
10
13
13
17
17
18
18
22
22
s
1
2
3
2
2
6
1
2
Running time (print): Ɵ(n)
?
Total running time: Ɵ(n
? 2)
Space: Ɵ(n)
?
Longest common subsequence
Longest common subsequence
Longest common subsequence
• subsequence:
• subsequence:
P I N E
S P R I N G T I M E
P I N E
S P R I N G T I M E
Longest common subsequence
Longest common subsequence
• subsequence:
• subsequence:
P I N E
S P R I N G T I M E
• Longest common subsequence
P I N E
S P R I N G T I M E
• Longest common subsequence
B A N A N A S
B A N A N A S
S A N D A L S
S A N D A L S
Longest common subsequence
Longest common subsequence
• Subproblem property:
• subproblem property:
Xi-1
Yj-1
xi
yj
Xi-1
Yj-1
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
B A N A N A S
B A N A N A S
S
S
A
A
N
Depends on ?
N
D
A
D
A
LCS(X5 , Y4 )
L
L
S
S
LCS(X5 , Y4 )
Longest common subsequence
Longest common subsequence
• subproblem property:
• subproblem property:
Xi-1
Yj-1
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
Depends on
S
A
N
N
LCS(X5 , Y4 )
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
B A N A N A S
A
D
A
Xi-1
Yj-1
B A N A N A S
S
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
D
A
L
L
S
S
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
Longest common subsequence
Longest common subsequence
• subproblem property:
• subproblem property:
Xi-1
Yj-1
xi
yj
Yj-1
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
S
Xi-1
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
B A N A N A S
0
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
S
A
A
N
N
D
A
D
A
L
L
S
S
B A N A N A S
0
Longest common subsequence
Longest common subsequence
• subproblem property:
• subproblem property:
Xi-1
Yj-1
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
1 , Yj ))
0 0
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
B A N A N A S
S
Xi-1
Yj-1
if i = 0 or j = 0
if xi = yj
if xi 6= yj
B A N A N A S
S
A
A
N
N
D
A
D
A
L
L
S
S
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
0 0 0 0 0 0
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
Longest common subsequence
Longest common subsequence
• subproblem property:
• subproblem property:
Xi-1
Yj-1
xi
yj
Yj-1
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
S
Xi-1
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
B A N A N A S
0 0 0 0 0 0 1
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
S
A
A
N
N
D
A
D
A
L
L
S
S
B A N A N A S
0 0 0 0 0 0 1
Longest common subsequence
Longest common subsequence
• subproblem property:
• subproblem property:
Xi-1
Yj-1
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
Xi-1
Yj-1
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
B A N A N A S
B A N A N A S
S
0 0 0 0 0 0 1
S
0 0 0 0 0 0 1
A
0
A
0
N
N
D
A
D
A
L
L
S
S
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
Longest common subsequence
Longest common subsequence
• subproblem property:
• subproblem property:
Xi-1
Yj-1
xi
yj
Xi-1
Yj-1
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
S
B A N A N A S
0 0 0 0 0 0 1
S
B A N A N A S
0 0 0 0 0 0 1
A
0 1
A
0 1
N
N
D
A
D
A
L
L
S
S
Longest common subsequence
Longest common subsequence
• subproblem property:
• subproblem property:
Xi-1
Yj-1
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
Xi-1
Yj-1
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
B A N A N A S
B A N A N A S
S
0 0 0 0 0 0 1
S
0 0 0 0 0 0 1
A
0 1 1
A
0 1 1
N
N
D
A
D
A
L
L
S
S
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
Longest common subsequence
Longest common subsequence
• subproblem property:
• subproblem property:
Xi-1
Yj-1
xi
yj
Xi-1
Yj-1
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
S
B A N A N A S
0 0 0 0 0 0 1
S
B A N A N A S
0 0 0 0 0 0 1
A
0 1 1 1
A
0 1 1 1
N
N
D
A
D
A
L
L
S
S
Longest common subsequence
Longest common subsequence
• subproblem property:
• subproblem property:
Xi-1
Yj-1
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
Xi-1
Yj-1
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
B A N A N A S
B A N A N A S
S
0 0 0 0 0 0 1
S
0 0 0 0 0 0 1
A
0 1 1 1 1
A
0 1 1 1 1
N
N
D
A
D
A
L
L
S
S
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
Longest common subsequence
Longest common subsequence
• subproblem property:
• subproblem property:
Xi-1
Yj-1
xi
yj
Xi-1
Yj-1
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
S
B A N A N A S
0 0 0 0 0 0 1
S
B A N A N A S
0 0 0 0 0 0 1
A
0 1 1 1 1 1
A
0 1 1 1 1 1 1
N
N 0 1 2 2 2 2 2
D
A
D 0 1 2 2 2 2 2
A 0 1 2 3 3 3 3
L
L 0 1 2 3 3 3 3
S
S
Running time: Ɵ(nm)
Space: Ɵ(nm)
Linear space: save only
last and current row
0 1 2 3 3 3 4
Longest common subsequence
Longest common subsequence
• subproblem property:
• subproblem property:
Xi-1
Yj-1
xi
yj
Xi-1
Yj-1
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
B A N A N A S
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
xi
yj
8
>
<0
LCS(Xi , Yj ) = LCS(Xi 1 , Yj 1 ) + 1
>
:
max(LCS(Xi , Yj 1 ), LCS(Xi
B A N A N A S
B A N A N A S
0 0 0 0 0 0 1
S
S
0 0 0 0 0 0 1
S
A
0 1 1 1 1 1 1
A
A
0 1 1 1 1 1 1
A
N
Value, not solution
D
A
N 0 1 2 2 2 2 2
N
D 0 1 2 2 2 2 2
A 0 1 2 3 3 3 3
D
A
D 0 1 2 2 2 2 2
A 0 1 2 3 3 3 3
L 0 1 2 3 3 3 3
L
L 0 1 2 3 3 3 3
L
S
S
S
S
0 1 2 3 3 3 4
0 1 2 3 3 3 4
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
B A N A N A S
S
N 0 1 2 2 2 2 2
1 , Yj ))
if i = 0 or j = 0
if xi = yj
if xi 6= yj
Longest common subsequence
B A N A N A S
S
A
N
D
A
L
S