9251 - LCS
본문
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
입력
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
출력
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.
제한
시간 제한 | 메모리 제한 |
---|---|
0.1sec | 256MB |
- $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;
}