Problem Solving/BOJ 백준
[ BOJ 백준 9251번 - LCS ] 해설 및 코드
재미지
2020. 2. 18. 04:17
https://www.acmicpc.net/problem/9251
목적
최장 공통 부분 수열(LCS)를 구하자. ACAYKP와 CAPCAK의 LCS는 ACAK이다.
접근법
1. 문자열 a와 b가 입력으로 주어질 때, s[i][j]는 a문자열의 i번째, b문자열의 j번째까지의 LCS라고 가정한다.
2. 그러면 s[i][j]는 다음 세 가지 결과 값의 최대값이다. s[i][j-1], s[i-1][j], s[i-1][j-1]+(a[i]==b[j])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include<bits/stdc++.h>
#define f(i,l,r) for(int i=l;i<r;++i)
using namespace std;
int s[1001][1001];
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
string a, b; cin >> a >> b;
s[0][0] = (a[0] == b[0]);
f(j, 1, b.length())s[0][j] = (a[0] == b[j]) ? 1 : s[0][j - 1];
f(i, 1, a.length())s[i][0] = (a[i] == b[0]) ? 1 : s[i - 1][0];
f(i, 1, a.length())f(j, 1, b.length())
s[i][j] = max((a[i] == b[j]) + s[i - 1][j - 1], max(s[i][j - 1], s[i - 1][j]));
cout << s[a.length() - 1][b.length() - 1];
return 0;
}
|
문제 설명과 코드에 대한 피드백은 언제나 환영합니다.
다양한 의견 댓글로 남겨주세요.