카테고리 없음

백준 9251번 LCS C/C++ 풀이

Chavo Kim 2020. 8. 19. 11:43

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

 

9251번: LCS

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

www.acmicpc.net

DP 문제, 그 중에서도 2차 배열을 이용하면 쉽게 풀 수 있다.

 

각각의 string 글자 수를 가진 2차 배열을 만들어서 각각의 cell을 채워나간다.

 

각각의 글자가 같지 않을 때는 왼쪽이나 위(i나 j가 같은) 중에서 크기가 큰 열을 선택하고, 같은 상황이 온다면 왼쪽 위에서 1을 더한 뒤 왼쪽이나 위 열과 크기를 비교해서 합친다.

 

string 입출력에 익숙해지기 위해 string 헤더를 사용했다.

 

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

using namespace std;

FILE* in = fopen("input.txt", "r");

string a;
string b;
int dp[1001][1001];

void get_matrix(int i, int j) {
	if (a[i] == b[j])
	{
		if (i == 0)
		{
			dp[i][j] = 1;
		}
		else if(j == 0)
		{
			dp[i][j] = 1;
		}
		else
		{
			int tmp = max(dp[i - 1][j], dp[i][j - 1]);
			dp[i][j] = max(tmp, dp[i - 1][j - 1] + 1);
		}
	}
	else
	{
		if (i == 0)
		{
			if (j == 0)
				dp[i][j] = 0;
			else
				dp[i][j] = dp[i][j - 1];
		}
		else if (j == 0)
		{
			dp[i][j] = dp[i - 1][j];
		}
		else
		{
			int tmp = max(dp[i - 1][j], dp[i][j - 1]);
			dp[i][j] = tmp;
		}
	}

}

int main() {
	cin >> a;
	cin >> b;
	for (int i = 0; i < a.length(); i++)
		for (int j = 0; j < b.length(); j++)
			get_matrix(i, j);
	/*for (int i = 0; i < a.length(); i++)
	{
		for (int j = 0; j < b.length(); j++)
			cout << dp[i][j] << ' ';
		cout << endl;
	}*/
	cout << dp[a.length() - 1][b.length() - 1];
	return 0;
}