๐ฉ๐ป๐พ
Chap 3. Dynamic Programming ๋ณธ๋ฌธ
Dynamic Programming์ด๋?
์ต์ ํ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํ ์ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ.
๋ฌธ์ ๋ฅผ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋๊ณ , ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ ์ ํด๋ฅผ ์ ์ฅํ์ฌ ์ค๋ณต ๊ณ์ฐ์ ํผํ ์ ์๊ณ , ์์ ๋ถ๋ถ ๋ฌธ์ ์ ํด๋ฅผ ์กฐํฉํ์ฌ ์ ์ฒด ๋ฌธ์ ์ ํด๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ(=Bottom-Up)
4๊ฐ์ง์ ์์๋ฅผ ํตํด Dynamic Programming์ ๋ํด ์์ธํ ์์๋ณด์.
1. The Binomial Coefficient
C(n, k) = C(n-1, k) + C(n-1, k-1) for 0<k<n
C(n, k) = 1 for k=0 or k=n
Pseudo-Code using Divide and Conquer -> Top Down
public static int Bin(int n , int k){
if(k == 0 || k == n)
return 1;
else
return Bin(n-1, k) + Bin(n-1, k-1);
}Pseudo-Code using Dynamic Programming
public static int Bin2(int n, int k){
index i, j;
int [][]B = new int[0..n][0..k];
for(i = 0; i <= n; i++)
for(j = 0; j <= min(i,k); j++)
if(j == 0 || j == i)
B[i][j]=1;
else
B[i][j]=B[i-1][j]+B[i-1][j-1];
return B[n][k];
}2. Floyd's Algorithm for Shortest Paths
given a pair of vertices (vi, vj), 1 <= i, j <= n
- D(k)[i][j] = ์ค์ง ์งํฉ {v1, v2, .... , vk} ์ ์๋ ๋ ธ๋๋ค๋ง ์ฌ์ฉํด์ vi โ vj ๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก
- D(0)[i][j] = W[i][j]
- ์ด๋ค ๋ ธ๋๋ ํต๊ณผํ์ง ์๊ณ ๋ฐ๋ก vi โ vj๋ก ๊ฐ๋ ๊ฒฝ๋ก
Floyd's Algorithm ์ฌ๊ท์
D(k)[i][j] = min(D(k-1)[i][j], D(k-1)[i - 1][j] + D(k-1)[i - 1][j - 1])
void Floyd(int n, const number W[][], number D[][]){
index i, j, k;
D = W;
for(k = 1; k <= n; k++)
for(i = 1; i <= n; i++)
for(j = 1; j<= n; j++)
D[i][j] = min(D[i][j], D[i][k] + D[k][j]);
}T(n) = n * n * n
void FloydPath(int n, const number W[][], number D[][], number P[][]){
idex i, j, k;
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
P[i][j] = 0; // ์ค๊ฐ์ ๊ฑฐ์น๋ v๊ฐ ์์
D = W;
for(k = 1; k <= n; k++)
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
if(D[i][k] + D[k][j] < D[i][j]{
D[i][j] = D[i][k] + D[k][j];
P[i][j] = k; // vi โ vj๋ก ๊ฐ ๋, k ๊ฑฐ์นจ
}
}void Path(index q, r) {
if(P[q][r] != 0) {
Path(q, P[q][r]);
cout << "v" << P[q][r];
Path(P[q][r], r);
}
}3. Optimal Binary Search Trees

Binary Search Tree ์ ์
- ๊ฐ๊ฐ์ ๋ ธ๋๋ ํ๋์ key๋ฅผ ํฌํจ
- ์ฃผ์ด์ง ๋ ธ๋์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์๋ key๋ค์ ์ฃผ์ด์ง ๋ ธ๋์ ํค๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์
- ์ฃผ์ด์ง ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์๋ key๋ค์ ์ฃผ์ด์ง ๋ ธ๋์ ํค๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์
Boundary condition
- A[i][i] = Pi
- key i ๋ง ๊ฐ์ง๊ณ binary search tree๋ฅผ ๋ง๋ฆ
- ์ฆ, ๋ ธ๋ 1๊ฐ์ง๋ฆฌ binary search tree๊ฐ ๋จ

โญ๏ธ โ ์์ ์ค๋ช
โญ๏ธ
Pk : ๋ฃจํธ ๋
ธ๋๊ฐ ๋ฑ์ฅํ ํ๋ฅ , Pk* 1 ๊ฐ์ธ๋ฐ ์๋ต๋ *1์ depth๊ฐ 1์ด๋ฏ๋ก ๊ณฑํด์ฃผ๋ ๊ฐ
A[1][k-1] : ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์ต์ ํ ๊ฐ
A[k+1][n] : ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์ต์ ํ ๊ฐ
์ฒซ๋ฒ์งธ โ : ์ผ์ชฝ ์๋ธํธ๋ฆฌ ๊ฐ๊ฐ์ key ๊ฐ๋ค์ ๋ฃจํธ ๋
ธ๋( = key k)์ ๋น๊ตํ ๊ฐ๋ค์ ํฉ
๋๋ฒ์งธ โ : ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ๊ฐ๊ฐ์ ๊ฐ๋ค์ ๋ฃจํธ ๋
ธ๋( = key k)์ ๋น๊ตํ ๊ฐ
Optimal Binary Search Trees ์ฌ๊ท์
A[i][j] = min(A[i][k-1] + A[k+1][j] + โ Pm
------------ Boundary Condition ------------
A[i][i] = Pi
A[i][i-1] = A[j+1][j] = 0 โ ์๋ case
----------------------------------------------
Pseudo-Code
void OptSearchTree(int n, const float p[], float& minavg, index R[][]){
index i, j, k, diagonal;
float A[1..n+1][o..n];
// boundary condition
for(i = 1; i <= n; i++){
A[i][i-1] = 0; A[i][i] = p[i];
R[i][i] = i; R[i][i-1] = 0;
}
A[n+1][n] = 0; R[n+1][n] = 0;
// recursive property
for(diagonal = 1; diagonal <= n-1; diagonal++)
for(i = 1; i <= n - diagonal; i++){
j = i + diagonal;
A[i][j] = min(A[i][k-1] + A[k+1][j]) + pm;
R[i][j] = a value of k giving the minimum;
}
// answer
minavg = A[1][n];
}T(n) = โ (j-i+1) * (n-diagonal) = โ (diagonal+1) * (n-diagonal) = n(n-1)(n+4)/6 โ ๐ฏ(n^3)
4. Traveling SalesPerson Problem(TSP)
TSP ์ฌ๊ท์
D[vi][A] = min(W[i][j] + D[vj][A-{vj}]) if A โ โ
------------ Boundary Condition ------------
D[vi][โ
] = W[i][1]
----------------------------------------------
Pseudo-Code
void Travel(int n, const number W[][], index p[][], number& minLength){
index i, j, k;
number D[1..n][subset of V-{v1}];
//boundary condition
for(i = 2; i <= n; i++)
D[i][โ
] = W[i][1];
for(k = 1; k <= n-2; k++)
for(all subsets A โ V-{v1} contains k nodes)
for(i such that iโ 1 and vi is not in A){
D[i][A] = min(W[i][j] + D[j][A-{vj}]);
R[i][A] = value of j giving the minimum
}
// answer
D[1][V-{v1}] = min(W[i][j] + D[j][V-{v1, vj}]);
P[1][V-{v1}] = value of j that gave the minimum;
minLength = D[1][V-{v1}];
}'Study > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Chap 9. Introduction to the Theory of NP (0) | 2023.06.11 |
|---|---|
| Chap 7. Introduction to Computational Complexity: The Sorting Problem (0) | 2023.06.08 |
| Chap 6. Branch and Bound (0) | 2023.06.06 |
| Chap 5. Backtracking (0) | 2023.06.04 |
| Chap 4. The Greedy Approach (0) | 2023.06.01 |