dp 백준 9251 LCS

2020. 2. 2. 08:52Algorithm/문제풀이

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

 

9251번: LCS

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

www.acmicpc.net

이 문제는 두개의 문자열 중 동일한 부분수열 중 가장 긴 부분수열의 개수를 구하는 문제이다. 

 

하나의 문자열을 베이스로 하나하나 동일한지 비교하며 표를 채워 나가면된다.

 

if (letter1[i] == letter2[j] ) 

이전 문자열 단계(이전 문자열의 최장 길이)에서 하나씩 증가하면 된다. 

결국 ACAYKP와 CAPCAK는 K의 이전 ACAY와 CAPCA의 최장길이에서 +1을 하면된다. 

 

동일하지 않다면 

이전의 dp 개수 또는 위의 dp 개수 중 큰 수를 선택하여 입력해주면된다. 

결국 ACAYKP와 CAPCAK는 ACAY와 CAPCA는 서로 끝이 다르다 이와 같은 경우에는 Y, A중 더 긴 길이의 값을 집어 넣으면 된다. 

 

백준예제의 경우 아래와 같이 표가 나오며 점화식을 구할 수 있다. 

더보기
#include <cstdio>
#include <string.h>
#include <algorithm>

using namespace std;

int dp[1003][1003];

int main(){
	char letter1[1003];
	char letter2[1003];

	scanf("%s", letter1);
	scanf("%s", letter2);

	int length1 = strlen(letter1);
	int length2 = strlen(letter2);

	for(int i = 1; i <= length1; i++){
		for(int j = 1; j <= length2; j++){
			if(letter1[i-1] == letter2[j-1])
				dp[i][j] = dp[i-1][j-1] + 1;
			else{
				dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
			}
		}
	}

	printf("%d", dp[length1][length2]);
}

'Algorithm > 문제풀이' 카테고리의 다른 글

1629번 곱셈  (0) 2020.02.20
백준 2004 조합 0의 개수  (0) 2020.02.20
dp 백준 11053, 11054 가장 긴 증가하는 부분 수열  (0) 2020.02.01
dp 백준 2156 포도주 시식  (0) 2020.02.01
dp 백준 쉬운 계단 수 10844  (0) 2020.02.01