본문 바로가기

코딩/알고리즘

백준 9251 LCS

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
char s1_arr[1001];
char s2_arr[1001];
int memo[1001][1001];

int main() {
	cin >> s1_arr >> s2_arr;
	int s1Size = strlen(s1_arr);
	int s2Size = strlen(s2_arr);
	for (int i = 1; i <= s1Size; i++) {
		for (int j = 1; j <= s2Size; j++) {
			if (s1_arr[i - 1] == s2_arr[j - 1]) {
				memo[i][j] = memo[i - 1][j - 1] + 1;
			}
			else {
				memo[i][j] = max(memo[i][j - 1], memo[i - 1][j]);
			}
		}
	}
	cout << memo[s1Size][s2Size] << endl;
	return 0;

}


DP의 전통스런 문제인 LCS, 최장공통부분수열을 찾는 문제이다.



일단 어떻게 풀지 두시간쯤 끄적여봤는데


도~저히 내 멍청한 머리로는 못 풀 문제 같아서ㅋㅋㅋㅋㅋㅋㅋ


포기하고 결국 구글링했다.


분명 예전에 본거 같은데 왜 기억이 안날까..



구글링해서 대충 위키를 보니 그제서야 예전에 본 기억이 딱 났다.


https://ko.wikipedia.org/wiki/%EC%B5%9C%EC%9E%A5_%EA%B3%B5%ED%86%B5_%EB%B6%80%EB%B6%84_%EC%88%98%EC%97%B4#cite_ref-1





풀이는 간단한데, 아이디어가 너무 어려운 문제..


DP[i][j] = if(X[i] == Y[i]) : DP[i-1][j-1] + 1

 else               max(DP[i-1][j] , DP[i][j-1])


X와 Y는 문자열 두개를 뜻하고 X[i]는 X의 i번째 문자를 뜻함.




'코딩 > 알고리즘' 카테고리의 다른 글

백준 2965 캥거루 세마리  (0) 2017.05.27
백준 11066 파일 합치기  (0) 2017.05.25
백준 1520 내리막 길  (0) 2017.05.22
백준 2156 포도주 시식  (0) 2017.05.22
백준 1005 ACM Craft  (1) 2017.05.21