Dynamic Programming(동적 계획법)의 개발절차
1. 재귀 관계식(recursive property) 세우기
2. 상향식 방법(bottom-up)으로 답 구하기
주어진 두 문자열을 X = , Y = 으로 둔다.
LCS(i, j)는 X = 와 Y = 사이의 LCS 길이 값을 의미한다.
(1<=i<=n, 1<=j<=m)
다음으로, 두 문자열의 마지막 문자에 대해 생각해보면, 2가지 경우의 수가 존재한다.
마지막 문자가 서로 같으므로, LCS에 포함시켜야 한다.
-> LCS(i, j) = LCS(i-1, j-1) + 1
이때는 또 2가지 경우로 나눌 수 있다.
2-1) x는 포함, y는 제외
-> LCS(i, j) = LCS(i, j-1)
2-2) x는 제외, y는 포함
-> LCS(i, j) = LCS(i-1, j)
그러므로 2-1, 2-2 중에서 큰 값을 LCS(i, j)에 저장해주면 된다.
재귀 관계식
LCS(i, j) = LCS(i-1, j-1) +1 (x = y)
LCS(i, j) = maximum(LCS(i, j-1), LCS(i-1, j)) (x ≠ y)
void calLCS() {
for (int i = 1;i <= strlen(s1);i++) {
for (int j = 1;j <= strlen(s2);j++) {
if (s1[i-1] == s2[j-1])
LCS[i][j] = LCS[i - 1][j - 1] + 1;
else
LCS[i][j] = maximum(LCS[i - 1][j], LCS[i][j - 1]);
}
}
}
// init
for (int i = 0;i <= len1;i++)
LCS[i][0] = 0;
for (int i = 0;i <= len2;i++)
LCS[0][i] = 0;
calLCS();