[백준/BOJ] 백준 9251번 : LCS

2020. 8. 27. 09:15알고리즘 문제풀이

https://www.acmicpc.net/problem/9251

 

9251번: LCS

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

www.acmicpc.net

input1 문자열의 point1 지점, input2 문자열의 point2 지점에서부터 확인해 나간다

 

코드

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;

int cache[1000][1000];
string input1;
string input2;

//input1 문자열의 point1지점, input2 문자열의 point2지점에서 확인해 나간다
int Solve(int point1, int point2)
{
	//범위를 넘어갔을때
	if (point1 >= input1.size())
		return 0;
	if (point2 >= input2.size())
		return 0;

	int& ret = cache[point1][point2];

	//계산한적이 있을때
	if (ret != -1)
		return ret;

	ret = 0;

	//같은 문자일때
	if (input1[point1] == input2[point2])
	{
		ret++;
		ret += Solve(point1 + 1, point2 + 1);
	}

	else
		ret += max(Solve(point1 + 1, point2), Solve(point1, point2 + 1));

	return ret;
}

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	memset(cache, -1, sizeof(cache));

	cin >> input1;
	cin >> input2;

	cout << Solve(0, 0);

	return 0;
}