728x90
๋์ ๊ณํ๋ฒ (DP)
- ์ต์ ํ ๋ฌธ์ , ๋ถํ ์ ๋ณต
- ํ ๋ฌธ์ ๋ฅผ ๋๊ฐ์ ๋ฌธ์ ์ด๋ฉด์ ํฌ๊ธฐ๋ง ์์ ๊ฒ์ผ๋ก ๋ฐ๊ฟ ์ ์์์ง ์๊ฐํด๋ณธ๋ค.
- ๊ธํ ๋ชจ์ผ๊ธฐ ๋ฌธ์
- D[i][j] : (i, j)๊น์ง ์ค๋ ๋์ ๋ชจ์ ์ ์๋ ๊ธํ์ ์ต๋๊ฐ
- D[i][j] = max( D[i-1],[j] , D[i][j-1] ) + map[i][j];
์ต๋ ๊ณต๋ฐฑ ์ ์ฌ๊ฐํ (ํฐ์์ผ๋ก๋ง ์ด๋ฃจ์ด์ง ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ)
- mm ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ด ์๋ค๋ฉด, 4๊ฐ์ (m-1)(m-1) ํฌ๊ธฐ ์ ์ฌ๊ฐํ์ด ์์ด์ผ ํ๋ค๋ ์ ์์ ์ฐฉ์ํ๋ค.
- D[x][y]๋ (x,y)๊ฐ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ ๊ผญ์ง์ ์ธ ์ ์ฌ๊ฐํ์ ์ต๋ ํฌ๊ธฐ๋ผ๊ณ ๊ฐ์ ํ๋ค.
- (x,y)๊ฐ ๊ฒ์์์ด๋ฉด, D[x][y] = 0
- ํฐ์์ด๋ฉด,
- x==1 && y==1 : D[x][y] = 1
- else : D[x][y] = min(D[x-1][y-1] , D[x-1][y] , D[x][y-1] ) + 1
์ต์ฅ ๊ณตํต ๋ถ๋ถ์์ด ๋ฌธ์ (LCS) : ์์๋ ์งํค๋, ์ฐ์์ผ ํ์๋ ์์. LCS ๊ธธ์ด ๊ตฌํ๊ธฐ
- ๋ธ๋ฃจํธ ํฌ์ค O(2^n) : ๊ธธ์ด๊ฐ n์ธ ์์ด์ ๋ํด์ ๊ฐ๋ฅํ ๋ชจ๋ 2^n๊ฐ์ ๋ถ๋ถ ์์ด์ ๋น๊ต
- ์ฌ๊ท O(m * n) : ํ๋๋ ๊ธธ์ด๊ฐ m, ๋ค๋ฅธ ํ๋๋ ๊ธธ์ด๊ฐ n์ผ ๋ (๋๋ค n์ด๋ฉด O(n^2))
- ABA์ DAB์ LCS๋ ์๋์ ์ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ผ ๊ฒ์ด๋ค. ๊ทธ ์ ์์ ์ฐฉ์ํ์ฌ ์ฌ๊ท๋ก ํ๋ฉด, O(m * n). LCS(AB, DAB), LCS(ABA, DA), LCS(AB, DA)
- ํ์ง๋ง ์ค๋ณต ๊ณ์ฐ์ด ๋ง์ด ๋ฐ์ํ๋ค๋ ๋จ์ ์ด ์๋ค.
int lcs( char *X, char *Y, int m, int n ) { if (m == 0 || n == 0) return 0; if (X[m-1] == Y[n-1]) return 1 + lcs(X, Y, m-1, n-1); // ๋งจ ๋ค ๋ฌธ์๊ฐ ๊ฐ์ผ๋ฉด 1์ ๋ํ๋ค. else return max(lcs(X, Y, m, n-1), lcs(X, Y, m-1, n)); // ๋งจ ๋ค ๋ฌธ์๊ฐ ๋ค๋ฅด๋ฉด, ๋ ์ค ํ๋๋ฅผ ๋บ ๊ฐ์ ์ต๋๊ฐ์ ๋ฐํ } int main() { char X[] = "AGGTAB"; char Y[] = "GXTXAYB"; int m = strlen(X); int n = strlen(Y); printf("Length of LCS is %d\\n", lcs( X, Y, m, n ) ); return 0; }
- DP : ์ค๋ณต๊ณ์ฐ์ด ์๋ O(m * n)
- ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ํ์ฉํ๋ฏ๋ก ์ฌ๊ท๋ณด๋ค ํจ์ฌ ํจ์จ์ ์ด๊ณ , ์ค๋ณต๊ณ์ฐ์ ํผํ ์ ์๋ค.
int lcs( char *X, char *Y, int m, int n ) { int L[m+1][n+1]; int i, j; for (i=0; i<=m; i++) { for (j=0; j<=n; j++) { if (i == 0 || j == 0) L[i][j] = 0; else if (X[i] == Y[j]) L[i][j] = L[i-1][j-1] + 1; // ํ์ฌ ๋ฌธ์๊ฐ ๊ฐ์ผ๋ฉด 1์ ๋ํ๊ธฐ else L[i][j] = max(L[i-1][j], L[i][j-1]); // ๋ค๋ฅด๋ฉด, ์ด์ ๊ฐ๋ค ์ค ์ต๋๊ฐ ๋ฃ๊ธฐ } } } return L[m][n]; }
๋ ๋ฌธ์์ด์ ์ ์ฌ๋
- Hamming Distance : ๋จ์ํ ํ๋ฆฐ ๊ธ์์๋ง ๋น๊ตํ๋ค. O(n). ๋งค์ฐ ๋ถ์ ํ.
- ํธ์ง ๊ฑฐ๋ฆฌ (Edit distance)
- ๋ฌธ์์ด a๋ฅผ b๋ก ๋ฐ๊พธ๊ธฐ ์ํด ๋ค์์ ์ฐ์ฐ์ด ์ต์ ๋ช ๋ฒ ํ์ํ๊ฐ?
- ํ ๊ธ์ ์ง์ฐ๊ธฐ, ํ ๊ธ์ ์ถ๊ฐํ๊ธฐ, ํ ๊ธ์ ๋ฐ๊พธ๊ธฐ
- ์ ํ์ : D[i][j] = T1[1..i]์ T2[1..j]๋ก ๋ฐ๊พธ๋ ํธ์ง ๊ฑฐ๋ฆฌ ์ ์ฅ → D[i][j]๋ ๋ค์ ์ธ ๊ฐ ์ค ์ต์๊ฐ์ด๋ค.
- D[i][j-1] + 1 : T1[1..i]์ T2[1..j-1]๋ก ๋ฐ๊พธ๊ณ ๋ง์ง๋ง ๋ฌธ์ T2[j] ์ถ๊ฐ
- D[i-1][j] + 1 : T1[1..i]์ ๋ง์ง๋ง ๊ธ์๋ฅผ ๋นผ์ T1[1..i-1]๋ก ๋ฐ๊พธ๊ณ ๋ง์ง๋ง ๋ฌธ์ ์ถ๊ฐํด์ T2[1..j]๋ก
- D[i-1][j-1] + 0/1 : T1[1..i-1]์ T2[1..j-1]๋ก ๋ฐ๊พผ ๋ค์, T1[i] == T2[j] : ๊ทธ๋๋ก, else : T1[i]์ T2[j]๋ก ๋ฐ๊พธ๋ ๊ฑฐ ํ๋ฒ
// DP ์ฝ๋ : O(m * n) int editDistDP(string str1, string str2, int m, int n) { int dp[m+1][n+1]; for (int i=0; i<=m; i++) { for (int j=0; j<=n; j++) { if (i==0) dp[i][j] = j; // Min. operations = j else if (j==0) dp[i][j] = i; // Min. operations = i else if (str1[i-1] == str2[j-1]) dp[i][j] = dp[i-1][j-1]; // ํ์ฌ ๋ฌธ์๊ฐ ๊ฐ์ผ๋ฉด else dp[i][j] = 1 + min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1]); // 3๊ฐ ์ค ์ต์์ ๋ฐฉ๋ฒ์ 1์ ๋ํ๊ธฐ } } return dp[m][n]; }
- ๋ฌธ์์ด a๋ฅผ b๋ก ๋ฐ๊พธ๊ธฐ ์ํด ๋ค์์ ์ฐ์ฐ์ด ์ต์ ๋ช ๋ฒ ํ์ํ๊ฐ?
728x90
'๐ ์ ๊ณต ๊ณต๋ถ > ๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ] 10. ๊ณ์ฐ ๊ธฐํ (1) | 2023.06.16 |
---|---|
[๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ] 9. Flow Networks (0) | 2023.06.16 |
[๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ] 8. ์๋ก์์ธ ์งํฉ์ ํํ (Disjoint Sets) (0) | 2023.06.16 |
[๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ] 7. ์ด๋ถ ํ์ (0) | 2023.04.19 |
[๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ] 6. ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ (0) | 2023.04.18 |