Home [9251] LCS
Post
Cancel

[9251] LCS

문제 링크 : https://www.acmicpc.net/problem/9251

9251 - LCS

본문

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

예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

입력

첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.

출력

첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.

제한

시간 제한메모리 제한
0.1sec256MB
  • $1 \leq \text{문자열의 길이} \leq 1000$

풀이

LCS 알고리즘의 스탠다드 문제이다. 설명은 LCS post에서 설명한 대로 진행한다.

  • 참고 알고리즘 : LCS

코드

사용 언어 : C

최종 수정일 : 2023 / 1 / 31

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>

#define First 0
#define Second 1

#define MAX_IDX 1001
char str[2][MAX_IDX + 1];
int len[2];
int dp[MAX_IDX + 1][MAX_IDX + 1];

#define max(a, b) (((a) > (b)) ? (a) : (b))

int main() {
    scanf("%s %s", &str[First][1], &str[Second][1]);
    str[First][0] = str[Second][0] = '0';

    for (len[First] = 0; str[First][len[First]] != '\0'; ++len[First]) {
    }
    for (len[Second] = 0; str[Second][len[Second]] != '\0'; ++len[Second]) {
    }

    for (int i = 1; i <= len[First]; ++i) {
        for (int j = 1; j <= len[Second]; ++j) {
            dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            if (str[First][i] == str[Second][j]) {
                dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1);
            }
        }
    }
    printf("%d", dp[len[First] - 1][len[Second] - 1]);
    return 0;
}
This post is licensed under CC BY 4.0 by the author.