Dynamic Programming
Contents
์คํธ๋ง ํธ์ง๊ฑฐ๋ฆฌ (Levenshtein Distance)
- ๋ ์คํธ๋ง์ ์ ์ฌ๋๋ฅผ ์ธก์ ํ๊ธฐ ์ํด ์ฌ์ฉ
- Levenshtein Distance ($LD$)๋ผ๊ณ ๋ ํจ
- ์๋์ ์คํธ๋ง์ $S$(source), ํธ์งํ๊ณ ์ ํ๋ ๋ชฉํ ์คํธ๋ง์ $T$(target), ๊ฐ๊ฐ์ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ $m$, $n$
- $\delta_{I}$๋ ์ฝ์
์ฐ์ฐ์ ๋น์ฉ
- $\delta_{D}$๋ ์ญ์ ์ฐ์ฐ์ ๋น์ฉ
- $\delta_{S}$๋ ๊ตํ ์ฐ์ฐ์ ๋น์ฉ
- ํธ์ง ๊ฑฐ๋ฆฌ : $๐$๋ฅผ $๐$๋ก ๋ณํํ๋๋ฐ ํ์ํ ์ฝ์
, ์ญ์ , ๋์น ์ฐ์ฐ์ ์ต์ ๋น์ฉ
- $๐$ = โtestโ, $๐$=โtestโ โ $LD(๐, ๐) = 0$
- $๐$ = โtestโ, $๐$=โtentโ โ $LD(๐, ๐) = 1$
- ํธ์ง ๊ฑฐ๋ฆฌ๊ฐ ์ปค์ง์๋ก, ๋ ์คํธ๋ง์ ์ ์ฌ๋๋ ๋ฎ์์ง๊ฒ ๋จ
- $๐ท[๐][๐]$๋ฅผ $๐ = ๐ _1, ๐ _2, โฆ ๐ _๐$์ $๐ = ๐ก_1, ๐ก_2, โฆ, ๐ก_๐$ ์ฌ์ด์ ํธ์ง ๊ฑฐ๋ฆฌ๋ผ๊ณ ํ ๋, $๐ท[๐][๐]$์ ์ ํ์ (Recursive Property)์ ์๋์ ๊ฐ๋ค.
์ฐ์ ํ๋ ฌ ๊ณฑ์
(Matrix-chain Multiplication)
- $i ร j$ ํ๋ ฌ๊ณผ $j ร k$ ํ๋ ฌ์ ๊ณฑํ๊ธฐ ์ํด์๋ ์ผ๋ฐ์ ์ผ๋ก $i ร j ร k$๋ฒ ๋งํผ์ ๊ธฐ๋ณธ์ ์ธ ๊ณฑ์
์ด ํ์ํ๋ค.
- ์ฐ์์ ์ผ๋ก ํ๋ ฌ์ ๊ณฑํ ๋, ์ด๋ค ํ๋ ฌ๊ณฑ์
์ ๋จผ์ ์ํํ๋๋์ ๋ฐ๋ผ์ ํ์ํ ๊ธฐ๋ณธ์ ์ธ ๊ณฑ์
์ ํ์๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋๋ค.
- ์๋ฅผ ๋ค์ด์, ๋ค์ ์ฐ์ํ๋ ฌ๊ณฑ์
์ ์๊ฐํด ๋ณด์:
- $A_1 ร A_2 ร A_3$
- $A_1$์ ํฌ๊ธฐ๋ $10 ร 100$์ด๊ณ , $A_2$์ ํฌ๊ธฐ๋ $100 ร 5$์ด๊ณ , $A_3$์ ํฌ๊ธฐ๋ $5 ร 50$๋ผ๊ณ ํ์.
- $A_1 ร A_2$๋ฅผ ๋จผ์ ๊ณ์ฐํ๋ค๋ฉด, ๊ธฐ๋ณธ์ ์ธ ๊ณฑ์
์ ์ด ํ์๋ 7,500ํ
- $A_2 ร A_3$๋ฅผ ๋จผ์ ๊ณ์ฐํ๋ค๋ฉด, ๊ธฐ๋ณธ์ ์ธ ๊ณฑ์
์ ์ด ํ์๋ 75,000ํ
- ๋ฐ๋ผ์, ์ฐ์์ ์ผ๋ก ํ๋ ฌ์ ๊ณฑํ ๋ ๊ธฐ๋ณธ์ ์ธ ๊ณฑ์
์ ํ์๊ฐ ๊ฐ์ฅ ์ ๊ฒ ๋๋ ์ต์ ์ ์์๋ฅผ ๊ฒฐ์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋ฐํ๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
- ์๊ณ ๋ฆฌ์ฆ: ๊ฐ๋ฅํ ๋ชจ๋ ์์๋ฅผ ๋ชจ๋ ๊ณ ๋ คํด ๋ณด๊ณ , ๊ทธ ๊ฐ์ด๋ฐ์์ ๊ฐ์ฅ ์ต์๋ฅผ ํํ๋ค. (DP)
- ์๊ฐ๋ณต์ก๋ ๋ถ์: ์ต์ํ ์ง์(exponential-time) ์๊ฐ
- ์ฆ๋ช
:
- $n$๊ฐ์ ํ๋ ฌ($A_1$, $A_2$, โฆ, $A_n$)์ ๊ณฑํ ์ ์๋ ๋ชจ๋ ์์์ ๊ฐ์ง ์๋ฅผ $t_n$์ด๋ผ๊ณ ํ์.
- ๋ง์ฝ $A_1$์ด ๋ง์ง๋ง์ผ๋ก ๊ณฑํ๋ ํ๋ ฌ์ด๋ผ๊ณ ํ๋ฉด, ํ๋ ฌ $A_2$, โฆ, $A_n$์ ๊ณฑํ๋ ๋ฐ๋ $t_{n-1}$๊ฐ์ ๊ฐ์ง์๊ฐ ์์ ๊ฒ์ด๋ค.
- $A_n$์ด ๋ง์ง๋ง์ผ๋ก ๊ณฑํ๋ ํ๋ ฌ์ด๋ผ๊ณ ํ๋ฉด, ํ๋ ฌ $A_1$, โฆ, $A_{n-1}$์ ๊ณฑํ๋ ๋ฐ๋ ๋ํ $t_{n-1}$๊ฐ์ ๊ฐ์ง์๊ฐ ์์ ๊ฒ์ด๋ค.
- ๊ทธ๋ฌ๋ฉด, $t_{n} \geq t_{n-1} + t_{n-1}=2 t_{n-1}$์ด๊ณ $t_{2}=1$์ด๋ผ๋ ์ฌ์ค์ ์ฝ๊ฒ ์ ์ ์๋ค.
- ๋ฐ๋ผ์ $t_{n}\geq 2 \cdot t_{n-1} \geq 2^2 \cdot t_{n-2}\geq \cdots \geq 2^{n-2} \cdot t_{2}= 2^{n-2} = \Theta(2^n)$
- $d_k$๋ฅผ ํ๋ ฌ $A_k$์ ์ด(column)์ ์๋ผ๊ณ ํ์. ๊ทธ๋ฌ๋ฉด ์์ฐํ $A_k$์ ํ(row)์ ์๋ $d_{k-1}$๊ฐ ๋๋ค.
- $A_{1}$์ ํ์ ์๋ $d_{0}$๋ผ๊ณ ํ์. ๊ทธ๋ฌ๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์ฌ๊ท ๊ด๊ณ์์ ๊ตฌ์ถํ ์ ์๋ค.
- $1\leq i\leq j\leq n$
- $M [ i ] [ j ] = i < j$์ผ ๋,
- $A_{i}$๋ถํฐ $A_{j}$๊น์ง์ ํ๋ ฌ์ ๊ณฑํ๋๋ฐ ํ์ํ ๊ธฐ๋ณธ์ ์ธ ๊ณฑ์
์ ์ต์ ํ์
- $M[i][j] = \mathrm{minimum}_{i \leq k \leq j-1} (M[i][k] + M[k+ 1][j] + d_{i-1} d_{k} d_{j})$
- if $i \geq j$, $M[i][j]=0$
์ต์ ์ด์ง ํ์ํธ๋ฆฌ (Optimal BST)
- ์ด์ง ํ์ ํธ๋ฆฌ
- ๋ฃจํธ์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์๋ ์์์ ํค ๊ฐ์ ๋ฃจํธ๋ณด๋ค ์๊ณ , ๋ฃจํธ์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์๋ ์์์ ํค ๊ฐ์ ๋ฃจํธ๋ณด๋ค ํฐ ์ด์ง ํธ๋ฆฌ
- ์ต์ ์ด์ง ํ์ ํธ๋ฆฌ
- ํธ๋ฆฌ ๋ด์ ํค์ ๊ฐ ํค๊ฐ ํ์๋ ํ๋ฅ ์ด ์ฃผ์ด์ ธ ์์ ๋ ๊ทธ ํธ๋ฆฌ์ ํ๊ท ํ์ ๋น์ฉ, ์ฆ, ํ๊ท ๋น๊ต ํ์๋ฅผ ๊ณ์ฐํ๊ณ ์ด๋ฅผ ์ต์ํํ๋ ํ์ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ ๋ฌธ์
- ํค ๊ฐ $a_{i} \leq a_{i+1} \leq \cdots \leq a_{j}$์ผ ๊ฒฝ์ฐ $A[i][j]$๋ ์ด์ง ํ์ ํธ๋ฆฌ์ $i$๋ถํฐ $j$๊น์ง์ ๋
ธ๋์ ๋ํ ์ต์ ํ๊ท ํ์ ์๊ฐ
<img src =โhttps://user-images.githubusercontent.com/73745836/171447644-d91df242-b233-4e71-b2a0-e547b010c667.jpegโ width = 40%/>
์ ํ์
$A[i][j]=\mathrm{min}_{i\leq k\leq j}\left ( A[i][k-1]+ A[k+ 1][j]+ \sum_{q=i}^{j}P\left ( a_q \right ) \right )$
$A[i][j]=P\left ( a_i \right )$
$A[i][i-1]=0, \ \textrm{for} \ 1\leq i\leq n-1 $
์๊ณ ๋ฆฌ์ฆ
OptimalBST(p[], r[], n) {
for (i โ 1; i โค n; i โ i + 1) do {
A[i,i] โ p[i];
r[i,i] โ i;
}
for (h โ 1; h < n; h โ h + 1) do {
for (i โ 1; i โค n-h; i โ i + 1) do {
j โ i + h;
A[i,j] โ miniโคkโคj(A[i,k-1] + A[k+1,j] + ฮฃ P[m]);
r[i,j] โ ์ต์ ๊ฐ์ ๊ฐ๋ k;
}
}
return A[1,n];
} end OmtimalBST()
node_pointer BuildTree( i, j ) {
index k;
node_pointer p;
k = r[i][j];
if(k==0) return;
else{
p = new node_pointer;
p -> key = Key[k];
p -> left = BuildTree( i, k-1 );
p -> right = BuildTree( k+1, j );
return p;
}
} end BuildTree()
์ต๋จ๊ฒฝ๋ก ์ฐพ๊ธฐ (Shortest Path)
๋ฌด์์ ์๊ณ ๋ฆฌ์ฆ (brute-force algorithm)
- ํ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ์ผ๋ก์ ๋ชจ๋ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ๊ตฌํ ๋ค, ๊ทธ๋ค ์ค์์ ์ต์ ๊ธธ์ด๋ฅผ ์ฐพ๋๋ค.
Floyd ์๊ณ ๋ฆฌ์ฆ I
- ๋ฌธ์ : ๊ฐ์ค์น ํฌํจ ๊ทธ๋ํ์ ๊ฐ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ ๋ฅผ ๊ณ์ฐํ๋ผ.
- ์
๋ ฅ: ๊ฐ์ค์น ํฌํจ, ๋ฐฉํฅ์ฑ ๊ทธ๋ํ $W$ ์ ๊ทธ ๊ทธ๋ํ์์์ ์ ์ ์ ์ $n$
- ์ถ๋ ฅ: ์ต๋จ๊ฑฐ๋ฆฌ์ ๊ธธ์ด๊ฐ ํฌํจ๋ ๋ฐฐ์ด $D$
์๊ณ ๋ฆฌ์ฆ
void floyd(int n, const number W[][], number D[][]) {
int 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] = minimum(D[i][j],D[i][k]+D[k][j]);
}
- ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ ๋ถ์:
- ๋จ์์ฐ์ฐ: for-
j
๋ฃจํ์์ ์ง์ ๋ฌธ
- ์
๋ ฅํฌ๊ธฐ: ๊ทธ๋ํ์์์ ์ ์ ์ ์ $n$
- $T(n)=n \times n \times n = n^3 \in \Theta \left ( n^3 \right )$
Floyd ์๊ณ ๋ฆฌ์ฆ II
- ๋ฌธ์ : ๊ฐ์ค์น ํฌํจ ๊ทธ๋ํ์ ๊ฐ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ ์ฐํ๊ณ , ๊ฐ๊ฐ์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ผ.
- ์
๋ ฅ: ๊ฐ์ค์น ํฌํจ ๋ฐฉํฅ์ฑ ๊ทธ๋ํ $W$ ์ ๊ทธ ๊ทธ๋ํ์์์ ์ ์ ์ ์ $n$
- ์ถ๋ ฅ: ์ต๋จ๊ฒฝ๋ก์ ๊ธธ์ด๊ฐ ํฌํจ๋ ๋ฐฐ์ด $D$ , ๊ทธ๋ฆฌ๊ณ ๋ค์์ ๋ง์กฑํ๋ ๋ฐฐ์ด $P$.
์๊ณ ๋ฆฌ์ฆ
void floyd2(int n, const number W[][], number D[][], index P[][]) {
index i, j, k;
for(i=1; i <= n; i++)
for(j=1; j <= n; j++)
P[i][j] = 0;
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]) {
P[i][j] = k; // ์ต์๊ฐ ์ ์ฅ
D[i][j] = D[i][k] + D[k][j];
}
}
TSP (Traveling Salesperson Problem)
- ํด๋ฐํด ๊ฒฝ๋ก(Hamiltonian Circuit), ์ผ์ฃผ์ฌํ๊ฒฝ๋ก : ๋ชจ๋ ์ ์ ์ ํ ๋ฒ์ฉ๋ง ๊ฑฐ์ณ์ ์ถ๋ฐํ ์ ์ ์ผ๋ก ๋ค์ ๋์์ค๋ ๊ฒฝ๋ก
- TSP (Traveling Salesperson Problem), ์ธํ์ ๋ฌธ์
- Mathematically formulated in the 1800s by the Irish mathematician William Rowan Hamilton
- an NP-hard problem in combinatorial optimization
- Is important in theoretical computer science and operations research.
- ์ต์ํ ํ๋์ ์ผ์ฃผ์ฌํ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ, ๊ฐ์ค์น ํฌํจ ๋ฐฉํฅ ๊ทธ๋ํ์์ ์ต์ ์ผ์ฃผ์ฌํ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์
- TSP ๋ฌธ์ ์ ์ฐ์ผ ์ฉ์ด
- $๐$ : ๋ชจ๋ ์ ์ ์ ์งํฉ
- $๐ด$ : $๐$์ ๋ถ๋ถ์งํฉ
- $D [v_{i} ] [ A ] = A$์ ์ํ ์ ์ ์ ๊ฐ๊ฐ ํ ๋ฒ์ฉ๋ง ๊ฑฐ์ณ์ $v_{i}$์์ $v_{1}$ ๋ก ๊ฐ๋ ์ต๋จ๊ฒฝ๋ก์ ๊ธธ์ด
- $v_{i}$ : ์ ์ , ๐ด : ์งํฉ
<img width=50% alt=โแแ
ณแแ
ณแ
แ
ตแซแแ
ฃแบ 2022-06-02แ
ฉแแ
ฎ 1 52 17โ src=โhttps://user-images.githubusercontent.com/73745836/171555320-ac0080fc-b55f-409d-b59a-1f16f36c87a5.pngโ>
0-1 Knapsack Problem
๋ฌธ์ :
- $S = { item_{1}, item_{2}, \cdots , item_{n} }$
- $w_i = \mathrm{weights\ of}\ item_{i}$
- $p_i = \mathrm{price\ of}\ item_{i}$
- $W = \mathrm{capacity\ of\ knapsack\ \left (Total\ weight\ that\ can\ be\ carried\ in\ the\ backpack \right )}$ ๋ผ๊ณ ํ ๋,
- $\sum_{item_i\in A} w_i\leq W$๋ฅผ ๋ง์กฑํ๋ฉด์ $\sum_{item_i\in A} p_i$๊ฐ ์ต๋๊ฐ ๋๋๋ก $A\subseteq S$๊ฐ ๋๋ $A$๋ฅผ ๊ฒฐ์ ํ๋ ๋ฌธ์ ์ด๋ค.
๋ฌด์์ (ํ์์ ) ์๊ณ ๋ฆฌ์ฆ
- $n$ ๊ฐ์ ๋ฌผ๊ฑด์ ๋ํด์ ๋ชจ๋ ๋ถ๋ถ์งํฉ์ ๋ค ๊ณ ๋ คํ๋ค.
- ๊ทธ๋ฌ๋ ๋ถํํ๊ฒ๋ ํฌ๊ธฐ๊ฐ $n$ ์ธ ์งํฉ์ ๋ถ๋ถ์งํฉ์ ์๋ $2^{n}$๊ฐ ์ด๋ค.
๋์ ๊ณํ์ ์ธ ์ ๊ทผ ๋ฐฉ๋ฒ
$i>0$์ด๊ณ $w>0$์ผ ๋, ์ ์ฒด ๋ฌด๊ฒ๊ฐ $w$๊ฐ ๋์ง ์๋๋ก $i$๋ฒ์งธ ๊น์ง์ ํญ๋ชฉ ์ค์์ ์ป์ด์ง ์ต๊ณ ์ ์ด์ต (optional profit)์ $P[i][w]$๋ผ๊ณ ํ๋ฉด,
์ ๊ฐ๋ค. ์ด๋, $๐[๐ โ 1][๐ค]$๋ $๐$๋ฒ์งธ ํญ๋ชฉ์ ํฌํจ์ํค์ง ์๋ ๊ฒฝ์ฐ์ ์ต๊ณ ์ด์ต์ด๊ณ ,
$๐_{๐} +๐[๐โ1][๐คโ๐ค_{๐}]$๋ ๐๋ฒ์งธ ํญ๋ชฉ์ ํฌํจ์ํค๋ ๊ฒฝ์ฐ์ ์ต๊ณ ์ด์ต์ด๋ค.