Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Kun-Mao Chao ( ) Department of Computer Science and Information Engineering National Taiwan University, Taiwan
E-mail: kmchao@csie.ntu.edu.tw WWW: http://www.csie.ntu.edu.tw/~kmchao
Dynamic Programming
Dynamic programming is a class of solution methods for solving sequential decision problems with a compositional cost structure. Richard Bellman was one of the principal founders of this approach.
2. overlapping subproblems
Subproblems are dependent. Each substructure is optimal. (otherwise, a divide-andconquer approach is the (Principle of optimality) 3 choice.)
Fibonacci numbers
The Fibonacci numbers are defined by the following recurrence:
F !0 0 F !1 1 F ! F F for i>1. i i 1 i 2
5
Tabular computation
The tabular computation can avoid recompuation.
F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 0 1 1 2 3 5 8 13 21 34 55
3 5 11 13
8
The subsequence 2, 3, 7, 8, 10, 13 is a longest increasing subsequence. This method runs in O(n2) time.
10
Binary search
Given an ordered sequence x1x2 ... xn, where x1<x2< ... <xn, and a number y, a binary search finds the largest xi such that xi< y in O(log n) time.
n/2 n/4
...
11
Binary search
How many steps would a binary search reduce the problem size to 1? n n/2 n/4 n/8 n/16 ... 1
How many steps? O(log n) steps.
n/2 !1
s ! log 2 n
12
8 8 10 10 13
For each position, we perform a binary search to update BestEnd. Therefore, the running time is O(n log n).
8 8 8 10 10 10 13 13
LCS
For instance, Sequence 1: president Sequence 2: providence Its LCS is priden.
president
providence
16
LCS
Another example: Sequence 1: algorithm Sequence 2: alignment One of its LCS is algm.
a l g o r i t h m
a l i g n m e n t
17
procedure LCS-Length(A, B) 1. for i 0 to m dolen(i,0) 0 2. for j 1 to n dolen(0,j) 0 3. for i 4. 5. 6. 7. 8. 9. return len and prev for j 1 to m do 1 to n do ( len i, j) ! len(i 1, j 1) 1 if ai ! bj then ( previ, j) !" " ( ( else if len i 1, j) u len i, j 1)
len(i, j) ! len(i 1, j) then ( previ, j) !" " len(i, j) ! len(i, j 1) else ( previ, j) !" "
19
0 0
1 p
0 1 1 1 1 1 1 1 1 1
2 r
0 1 2 2 2 2 2 2 2 2
3 o
0 1 2 2 2 2 2 2 2 2
4 v
0 1 2 2 2 2 2 2 2 2
5 i
0 1 2 2 2 3 3 3 3 3
6 d
0 1 2 2 2 3 4 4 4 4
7 e
0 1 2 3 3 3 4 5 5 5
8 n
0 1 2 3 3 3 4 5 6 6
9 c
0 1 2 3 3 3 4 5 6 6
10 e
0 1 2 3 3 3 4 5 6 6
0 1 2 3 4 5 6 7 8 9
p r e s i d e n t
0 0 0 0 0 0 0 0 0
20
proce 1 2 3 4
re Output-LCS( , prev, i, j)
if i = 0 or j = 0 t e retur Output LCS ( A, prev, i 1, j 1) if prev(i, j)= t e print ai else if prev(i, j)= t e Output-LCS( , prev, i-1, j) else Output-LCS( , prev, i, j-1)
21
0 0
1 p
0 1 1 1 1 1 1 1 1 1
2 r
0 1 2 2 2 2 2 2 2 2
3 o
0 1 2 2 2 2 2 2 2 2
4 v
0 1 2 2 2 2 2 2 2 2
5 i
0 1 2 2 2 3 3 3 3 3
6 d
0 1 2 2 2 3 4 4 4 4
7 e
0 1 2 3 3 3 4 5 5 5
8 n
0 1 2 3 3 3 4 5 6 6
9 c
0 1 2 3 3 3 4 5 6 6
10 e
0 1 2 3 3 3 4 5 6 6
0 1 2 3 4 5 6 7 8 9
p r e s i d e n t
0 0 0 0 0 0 0 0 0
Output: priden
22
23