본문 바로가기
알고리즘, 자료구조/알고리즘

9251 LCS

by Wordbe 2019. 6. 9.
728x90

LCS 또한 교재에서 볼 수 있는 DP의 전형적인 문제이다.

 

 

 

길이가 각각 i, j인 문자열 x, y가 있다고 해보자.

 

LCS(i, j) 는 문자열 x, y의 최장 공통 부분 수열(LCS)이라고 할 때,

다음과 같이 점화식을 세울 수 있다.

 

LCS(i, j) =

    LCS(i-1, j-1) + 1 if x[i] == y[j]

    max( LCS(i-1, j), LCS(i, j-1) ) otherwise

 

이렇게 만들어놓고, i와 j에 따른 dynamic programming을 구현하기 위하여

d[i][j]를 만든다.

그리고 이 행렬을 잘 채워나가다가, 맨 마지막 오른쪽 부분

즉, d[i][j]가 우리가 원하는 LSC 값이다.

 

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

int d[1001][1001];

int main() {
	string a, b;
	cin >> a >> b;

	for (int i = 1; i < a.size() + 1; i++) {
		for (int j = 1; j < b.size() + 1; j++) {
			if (a[i-1] == b[j-1]){
				d[i][j] = d[i - 1][j - 1] + 1;
			}
			else {
				d[i][j] = max(d[i - 1][j], d[i][j - 1]);
			}
		}
	}
	printf("%d\n", d[a.size()][b.size()]);
	return 0;
}
728x90

'알고리즘, 자료구조 > 알고리즘' 카테고리의 다른 글

11729 하노이 탑  (719) 2019.06.28
[백트래킹] 1987 알파벳  (979) 2019.06.27
GCD algorithm  (0) 2019.06.11
2293 동전 1  (0) 2019.06.09
5639 이진검색트리  (0) 2019.06.08

댓글