• 沒有找到結果。

Recursively define the value of an optimal solution

3. Compute the value of an optimal solution

4. Construct an optimal solution from computed information

Step 1-Q1: What can be the subproblems?

Step 1-Q2: Does it exhibit optimal structure? (an optimal solution can be represented by the optimal solutions to subproblems)

Yes.  continue

No.  go to Step 1-Q1 or there is no DP solution for this problem Rod Cutting Problem

Input: a rod of length 𝑛 and a table of prices 𝑝𝑖 for 𝑖 = 1, … , 𝑛 Output: the maximum revenue 𝑟𝑛 obtainable

Step 1-Q1: What can be the subproblems?

Subproblems: Cut-Rod(0), Cut-Rod(1), …, Cut-Rod(n-1)

Cut-Rod(i): rod cutting problem with length-i rod

Goal: Cut-Rod(n)

Suppose we know the optimal solution to Cut-Rod(i), there are i cases:

Case 1: the first segment in the solution has length 1

Case 2: the first segment in the solution has length 2

:

Case i: the first segment in the solution has length i 39 Rod Cutting Problem

Input: a rod of length 𝑛 and a table of prices 𝑝𝑖 for 𝑖 = 1, … , 𝑛 Output: the maximum revenue 𝑟𝑛 obtainable

從solution中拿掉一段長度為1的鐵條, 剩下的部分是Cut-Rod(i-1)的最佳解 從solution中拿掉一段長度為2的鐵條, 剩下的部分是Cut-Rod(i-2)的最佳解

Step 1-Q2: Does it exhibit optimal structure? (an optimal solution can be represented by the optimal solutions to subproblems)

Yes. Prove by contradiction.

Rod Cutting Problem

Input: a rod of length 𝑛 and a table of prices 𝑝𝑖 for 𝑖 = 1, … , 𝑛 Output: the maximum revenue 𝑟𝑛 obtainable

Suppose we know the optimal solution to Cut-Rod(i), there are i cases:

Case 1: the first segment in the solution has length 1

Case 2: the first segment in the solution has length 2

:

Case i: the first segment in the solution has length i

Recursively define the value Rod Cutting Problem

Input: a rod of length 𝑛 and a table of prices 𝑝𝑖 for 𝑖 = 1, … , 𝑛 Output: the maximum revenue 𝑟𝑛 obtainable

從solution中拿掉一段長度為1的鐵條, 剩下的部分是Cut-Rod(i-1)的最佳解

從solution中拿掉一段長度為2的鐵條, 剩下的部分是Cut-Rod(i-2)的最佳解

從solution中拿掉一段長度為i的鐵條, 剩下的部分是Cut-Rod(0)的最佳解

Bottom-up method: solve smaller subproblems first

42

Rod Cutting Problem

Input: a rod of length 𝑛 and a table of prices 𝑝𝑖 for 𝑖 = 1, … , 𝑛 Output: the maximum revenue 𝑟𝑛 obtainable

i 0 1 2 3 4 5 n

r[i]

Bottom-Up-Cut-Rod(p, n) r[0] = 0

for j = 1 to n // compute r[1], r[2], ... in order q = -∞

for i = 1 to j

q = max(q, p[i] + r[j - i]) r[j] = q

return r[n]

Bottom-up method: solve smaller subproblems first Rod Cutting Problem

Input: a rod of length 𝑛 and a table of prices 𝑝𝑖 for 𝑖 = 1, … , 𝑛 Output: the maximum revenue 𝑟𝑛 obtainable

i 0 1 2 3 4 5 n

r[i] 0

cut[i] 0 1

1

2 5

3 8

2 10

length 𝑖 1 2 3 4 5

price 𝑝𝑖 1 5 8 9 10

Cut-Rod(p, n) r[0] = 0

for j = 1 to n // compute r[1], r[2], ... in order q = -∞

for i = 1 to j

if q < p[i] + r[j - i]

q = p[i] + r[j - i]

cut[j] = i // the best first cut for len j rod r[i] = q

return r[n], cut

Print-Cut-Rod-Solution(p, n) (r, cut) = Cut-Rod(p, n) while n > 0

print cut[n]

n = n – cut[n] // remove the first piece

45

▪ Input: the postage 𝑛 and the stamps with values 𝑣

1

, 𝑣

2

, … , 𝑣

𝑘

▪ Output: the minimum number of stamps to cover the postage

The optimal solution 𝑆

𝑛

can be recursively defined as

Stamp(v, n) r_min = ∞

if n == 0 // base case return 0

for i = 1 to k // recursive case r[i] = Stamp(v, n - v[i])

if r[i] < r_min r_min = r[i]

return r_min + 1

Subproblems

S(i): the min #stamps with postage i

Goal: S(n)

Optimal substructure: suppose we know the optimal solution to S(i), there are k cases:

Case 1: there is a stamp with v1 in OPT

Case 2: there is a stamp with v2 in OPT

:

Case k: there is a stamp with vk in OPT

48

Stamp Problem

Input: the postage 𝑛 and the stamps with values 𝑣1, 𝑣2, … , 𝑣𝑘 Output: the minimum number of stamps to cover the postage

從solution中拿掉一張郵資為v1的郵票, 剩下的部分是S(i-v[1])的最佳解

從solution中拿掉一張郵資為v2的郵票, 剩下的部分是S(i-v[2])的最佳解

從solution中拿掉一張郵資為v 的郵票, 剩下的部分是S(i-v[k])的最佳解

Suppose we know the optimal solution to S(i), there are k cases:

Case 1: there is a stamp with v1 in OPT

Case 2: there is a stamp with v2 in OPT

:

Case k: there is a stamp with vk in OPT

Recursively define the value

Stamp Problem

Input: the postage 𝑛 and the stamps with values 𝑣1, 𝑣2, … , 𝑣𝑘 Output: the minimum number of stamps to cover the postage

從solution中拿掉一張郵資為v1的郵票, 剩下的部分是S(i-v[1])的最佳解

從solution中拿掉一張郵資為v2的郵票, 剩下的部分是S(i-v[2])的最佳解

從solution中拿掉一張郵資為vk的郵票, 剩下的部分是S(i-v[k])的最佳解

Bottom-up method: solve smaller subproblems first

50

Stamp Problem

Input: the postage 𝑛 and the stamps with values 𝑣1, 𝑣2, … , 𝑣𝑘 Output: the minimum number of stamps to cover the postage

i 0 1 2 3 4 5 n

S[i]

Stamp(v, n) S[0] = 0

for i = 1 to n // compute r[1], r[2], ... in order r_min = ∞

for j = 1 to k

if S[i - v[j]] < r_min r_min = 1 + S[i – v[j]]

return S[n]

Stamp(v, n) S[0] = 0

for i = 1 to n r_min = ∞

for j = 1 to k

if S[i - v[j]] < r_min r_min = 1 + S[i – v[j]]

B[i] = j // backtracking for stamp with v[j]

return S[n], B

Print-Stamp-Selection(v, n) (S, B) = Stamp(v, n)

while n > 0 print B[n]

n = n – v[B[n]]

Textbook Chapter 15.2 – Matrix-chain multiplication

52

Input: a sequence of n matrices 𝐴

1

, … , 𝐴

𝑛

Output: the product of 𝐴

1

𝐴

2

… 𝐴

𝑛

𝐴1 𝐴2 𝐴3 𝐴4 …… 𝐴𝑛

𝐴1.cols=𝐴2.rows

𝐴1and 𝐴2are compatible.

54

Each entry takes 𝑞 multiplications

There are total 𝑝𝑟 entries

A B C

Matrix multiplication is associative: 𝐴 𝐵𝐶 = (𝐴𝐵)𝐶. The time required by obtaining 𝐴 × 𝐵 × 𝐶 could be affected by which two matrices multiply first .

Overall time is

= =

Overall time is

= =

Input: a sequence of integers 𝑙

0

, 𝑙

1

, … , 𝑙

𝑛

𝑙𝑖−1 is the number of rows of matrix 𝐴𝑖

𝑙𝑖 is the number of columns of matrix 𝐴𝑖

Output: a order of performing 𝑛 − 1 matrix multiplications in the minimum number of operations to obtain the product of 𝐴

1

𝐴

2

… 𝐴

𝑛

𝐴1 𝐴2 𝐴3 𝐴4 …… 𝐴𝑛

𝐴1.cols=𝐴2.rows

𝐴1and 𝐴2are compatible.

Do not need to compute the result but find the fast way to get the result!

𝑃

𝑛

: how many ways for 𝑛 matrices to be multiplied

The solution of 𝑃

𝑛

is Catalan numbers, Ω

4𝑛

𝑛

3 2

, or is also Ω 2

𝑛 Exercise 15.2-3

Subproblems

M(i, j): the min #operations for obtaining the product of 𝐴𝑖 … 𝐴𝑗

Goal: M(1, n)

Optimal substructure: suppose we know the OPT to M(i, j) , there are k cases:

Case k: there is a cut right after Ak in OPT Matrix-Chain Multiplication Problem

Input: a sequence of integers 𝑙0, 𝑙1, … , 𝑙𝑛indicating the dimensionality of 𝐴𝑖

Output: a order of matrix multiplications with the minimum number of operations

左右所花的運算量是M(i, k)M(k+1, j)的最佳解

𝐴𝑖𝐴𝑖+1… 𝐴𝑘 𝐴𝑘+1𝐴𝑘+2 … 𝐴𝑗 𝑖 ≤ 𝑘 < 𝑗

Suppose we know the optimal solution to M(i, j), there are k cases:

Case k: there is a cut right after Ak in OPT

Recursively define the value

左右所花的運算量是M(i, k)M(k+1, j)的最佳解

Matrix-Chain Multiplication Problem

Input: a sequence of integers 𝑙0, 𝑙1, … , 𝑙𝑛indicating the dimensionality of 𝐴𝑖

Output: a order of matrix multiplications with the minimum number of operations

𝐴𝑘+1..𝑗 𝐴𝑖.rows

=𝑙𝑖−1

𝐴𝑘.cols=𝑙𝑘

𝐴𝑘+1.rows=𝑙𝑘

𝐴𝑗.cols=𝑙𝑗 𝐴𝑖𝐴𝑖+1… 𝐴𝑘 𝐴𝑘+1𝐴𝑘+2… 𝐴𝑗 =

Bottom-up method: solve smaller subproblems first

How many subproblems to solve

#combination of the values 𝑖 and 𝑗 s.t. 1 ≤ 𝑖 ≤ 𝑗 ≤ 𝑛

Matrix-Chain Multiplication Problem

Input: a sequence of integers 𝑙0, 𝑙1, … , 𝑙𝑛indicating the dimensionality of 𝐴𝑖

Output: a order of matrix multiplications with the minimum number of operations

Matrix-Chain(n, l)

initialize two tables M[1..n][1..n] and B[1..n-1][2..n]

for i = 1 to n

M[i][i] = 0 // boundary case

for p = 2 to n // p is the chain length

for i = 1 to n – p + 1 // all i, j combinations j = i + p – 1

M[i][j] = ∞

for k = i to j – 1 // find the best k

q = M[i][k] + M[k + 1][j] + l[i - 1] * l[k] * l[j]

if q < M[i][j]

M[i][j] = q return M

How to decide the order of the matrix

multiplication?

1 2 3 4 5 6 n

1 0

2 0

3 0

4 0

5 0

6 0

0

n 0

64

Matrix-Chain(n, l)

initialize two tables M[1..n][1..n] and B[1..n-1][2..n]

for i = 1 to n

M[i][i] = 0 // boundary case

for p = 2 to n // p is the chain length

for i = 1 to n – p + 1 // all i, j combinations j = i + p – 1

M[i][j] = ∞

for k = i to j – 1 // find the best k

q = M[i][k] + M[k + 1][j] + l[i - 1] * l[k] * l[j]

if q < M[i][j]

M[i][j] = q

B[i][j] = k // backtracking return M and B

Print-Optimal-Parens(B, i, j) if i == j

print 𝐴𝑖 else

print “(”

Print-Optimal-Parens(B, i, B[i][j]) Print-Optimal-Parens(B, B[i][j] + 1, j) print “)”

Matrix 𝑨𝟏 𝑨𝟐 𝑨𝟑 𝑨𝟒 𝑨𝟓 𝑨𝟔 Dimension 30 x 35 35 x 15 15 x 5 5 x 10 10 x 20 20 x 25

1 2 3 4 5 6

1 0

2 0

3 0

4 0

5 0

6 0

15,750

2,625 750

1,000

5,000 7,875

4,375

2,500

3,500 9,375

7,125

53,75 11,875

10,500 15,125

1 2 3 4 5 6

1 2 3 4 5 6

1

2

3

4

5 1

3

3

5 3

3

3 3

3 3

Textbook Chapter 15.4 – Longest common subsequence Textbook Problem 15.5 – Edit distance

66

猴子們各自講話,經過語音辨識系統後,哪一支猴子發出最接近英 文字”banana”的語音為優勝者

How to evaluate the similarity between two sequences?

aeniqadikjaz

svkbrlvpnzanczyqza

banana

Input: two sequences

Output: longest common subsequence of two sequences

The maximum-length sequence of characters that appear left-to-right (but not necessarily a continuous string) in both sequences

X = banana

Y = svkbrlvpnzanczyqza X → ---ba---n-an---a Y → svkbrlvpnzanczyqza X = banana

Y = aeniqadikjaz X → ba-n--an---a-Y → -aeniqadikjaz

The infinite monkey theorem: a monkey hitting keys at random for an infinite amount of time will almost surely type a given text

4 5

Input: two sequences

Output: the minimum cost of transformation from X to Y

Quantifier of the dissimilarity of two strings

X = banana

Y = svkbrlvpnzanczyqza X → ---ba---n-an---a Y → svkbrlvpnzanczyqza X = banana

Y = aeniqadikjaz X → ba-n--an---a-Y → -aeniqadikjaz

1 deletion, 7 insertions, 1 substitution 12 insertions, 1 substitution

9 13

Input: two sequences

Output: the minimal cost 𝑀

𝑚,𝑛

for aligning two sequences

Cost = #insertions × 𝐶INS + #deletions × 𝐶DEL + #substitutions × 𝐶𝑝,𝑞

Subproblems

SA(i, j): sequence alignment between prefix strings 𝑥1, … , 𝑥𝑖 and 𝑦1, … , 𝑦𝑗

Goal: SA(m, n)

Optimal substructure: suppose OPT is an optimal solution to SA(i, j), there are 3 cases:

Case 1: 𝑥𝑖 and 𝑦𝑗 are aligned in OPT (match or substitution)

OPT/{𝑥𝑖, , 𝑦𝑗} is an optimal solution of SA(i-1, j-1)

Case 2: 𝑥𝑖 is aligned with a gap in OPT (deletion)

OPT is an optimal solution of SA(i-1, j)

Case 3: 𝑦𝑗 is aligned with a gap in OPT (insertion)

OPT is an optimal solution of SA(i, j-1)

Sequence Alignment Problem Input: two sequences

Output: the minimal cost 𝑀𝑚,𝑛 for aligning two sequences

Suppose OPT is an optimal solution to SA(i, j), there are 3 cases:

Case 1: 𝑥𝑖 and 𝑦𝑗 are aligned in OPT (match or substitution)

OPT/{𝑥𝑖, , 𝑦𝑗} is an optimal solution of SA(i-1, j-1)

Case 2: 𝑥𝑖 is aligned with a gap in OPT (deletion)

OPT is an optimal solution of SA(i-1, j)

Case 3: 𝑦𝑗 is aligned with a gap in OPT (insertion)

OPT is an optimal solution of SA(i, j-1)

Recursively define the value

Sequence Alignment Problem Input: two sequences

Output: the minimal cost 𝑀𝑚,𝑛 for aligning two sequences

Bottom-up method: solve smaller subproblems first

X\Y 0 1 2 3 4 5 n

0 1 : m

Sequence Alignment Problem Input: two sequences

Output: the minimal cost 𝑀𝑚,𝑛 for aligning two sequences

Bottom-up method: solve smaller subproblems first

74

X\Y 0 1 2 3 4 5 6 7 8 9 10 11 12

0 0 4 8 12 16 20 24 28 32 36 40 44 48

1 4 7 11 15 19 23 27 31 35 39 43 47 51

2 8 4 8 12 16 20 23 27 31 35 39 43 47

3 12 8 12 8 12 16 20 24 28 32 36 40 44

4 16 12 15 12 15 19 16 20 24 28 32 36 40 5 20 16 19 15 19 22 20 23 27 31 35 39 43 6 24 20 23 19 22 26 22 26 30 34 38 35 39

Sequence Alignment Problem Input: two sequences

Output: the minimal cost 𝑀𝑚,𝑛 for aligning two sequences

a e n i q a d i k j a z

b a n a n a

Seq-Align(X, Y, CDEL, CINS, Cp,q) for j = 0 to n

M[0][j] = j * CINS // |X|=0, cost=|Y|*penalty for i = 1 to m

M[i][0] = i * CDEL // |Y|=0, cost=|X|*penalty for i = 1 to m

for j = 1 to n

M[i][j] = min(M[i-1][j-1]+Cxi,yi, M[i-1][j]+CDEL, M[i][j-1]+CINS)

Bottom-up method: solve smaller subproblems first Sequence Alignment Problem

Input: two sequences

Output: the minimal cost 𝑀𝑚,𝑛 for aligning two sequences

76

Bottom-up method: solve smaller subproblems first Sequence Alignment Problem

Input: two sequences

Output: the minimal cost 𝑀𝑚,𝑛 for aligning two sequences

X\Y 0 1 2 3 4 5 6 7 8 9 10 11 12

0 0 4 8 12 16 20 24 28 32 36 40 44 48

1 4 7 11 15 19 23 27 31 35 39 43 47 51

2 8 4 8 12 16 20 23 27 31 35 39 43 47

3 12 8 12 8 12 16 20 24 28 32 36 40 44

4 16 12 15 12 15 19 16 20 24 28 32 36 40 5 20 16 19 15 19 22 20 23 27 31 35 39 43 6 24 20 23 19 22 26 22 26 30 34 38 35 39

a e n i q a d i k j a z

b a n a n a

Bottom-up method: solve smaller subproblems first Sequence Alignment Problem

Input: two sequences

Output: the minimal cost 𝑀𝑚,𝑛 for aligning two sequences

Find-Solution(M) if m = 0 or n = 0

return {}

v = min(M[m-1][n-1] + Cxm,yn, M[m-1][n] + CDEL, M[m][n-1] + CINS) if v = M[m-1][n] + CDEL // ↑: deletion

return Find-Solution(m-1, n)

if v = M[m][n-1] + CINS // ←: insertion return Find-Solution(m, n-1)

78

Find-Solution(M) if m = 0 or n = 0

return {}

v = min(M[m-1][n-1] + Cxm,yn, M[m-1][n] + CDEL, M[m][n-1] + CINS) if v = M[m-1][n] + CDEL // ↑: deletion

return Find-Solution(m-1, n)

if v = M[m][n-1] + CINS // ←: insertion return Find-Solution(m, n-1)

return {(m, n)} ∪ Find-Solution(m-1, n-1) // ↖: match/substitution Seq-Align(X, Y, CDEL, CINS, Cp,q)

for j = 0 to n

M[0][j] = j * CINS // |X|=0, cost=|Y|*penalty for i = 1 to m

M[i][0] = i * CDEL // |Y|=0, cost=|X|*penalty for i = 1 to m

for j = 1 to n

M[i][j] = min(M[i-1][j-1]+Cxi,yi, M[i-1][j]+CDEL, M[i][j-1]+CINS) return M[m][n]

79

相關文件