링크
https://www.acmicpc.net/problem/9251
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.
ACAYKP
CAPCAK
4
char a[1000]; // 첫번째 문자열을 저장하는 배열
char b[1000]; // 두번째 문자열을 저장하는 배열
int n, k;
scanf("%s", &a);
scanf("%s", &b);
n = strlen(a); // 첫번째 문자열의 길이
k = strlen(b); // 두번째 문자열의 길이
// 2차원 배열 동적할당
dp = (int**)calloc(n+1, sizeof(int*));
for (int i = 0; i < n+1; i++)
dp[i] = (int*)calloc(k+1, sizeof(int));
void LCS(char a[], char b[], int n, int k)
{
for (int i = 0; i < n + 1; i++) {
for (int j = 0; j < k + 1; j++) {
if (i == 0 || j == 0) // a와 b문자열 중 하나의 길이라도 0이면
dp[i][j] = 0;
else if (a[i - 1] == b[j - 1]) // 현재 비교한 문자가 같은 경우
dp[i][j] = dp[i - 1][j - 1]+1;
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); // a문자열의 포인터를 1 감소시킨 경우와 b문자열의 포인터를 1 감소시킨 경우 중 일치하는 문자열의 개수가 더 값을 저장
}
}
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define max(a,b) a > b ? a : b
int** dp; // 동적계획법에 사용할 dp 테이블
void LCS(char a[], char b[], int n, int k)
{
for (int i = 0; i < n + 1; i++) {
for (int j = 0; j < k + 1; j++) {
if (i == 0 || j == 0) // a와 b문자열 중 하나의 길이라도 0이면
dp[i][j] = 0;
else if (a[i - 1] == b[j - 1]) // 현재 비교한 문자가 같은 경우
dp[i][j] = dp[i - 1][j - 1]+1;
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); // a문자열의 포인터를 1 감소시킨 경우와 b문자열의 포인터를 1 감소시킨 경우 중 일치하는 문자열의 개수가 더 값을 저장
}
}
}
int main()
{
char a[1000]; // 첫번째 문자열을 저장하는 배열
char b[1000]; // 두번째 문자열을 저장하는 배열
int n, k;
int cnt = 0;
scanf("%s", &a);
scanf("%s", &b);
n = strlen(a); // 첫번째 문자열의 길이
k = strlen(b); // 두번째 문자열의 길이
// 2차원 배열 동적할당
dp = (int**)calloc(n+1, sizeof(int*));
for (int i = 0; i < n+1; i++)
dp[i] = (int*)calloc(k+1, sizeof(int));
LCS(a, b, n, k); // LCS 함수 실행
printf("%d", dp[n][k]); // 결과 출력
// 메모리 할당 해제
for (int i = 0; i < n; i++)
free(dp[i]);
free(dp);
return 0;
}