반응형
문제링크:www.acmicpc.net/problem/9252
9252번: LCS 2
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
www.acmicpc.net
LCS문제입니다.
LCS에 대한 설명은 아래 링크를 참고하세요
LCS 알고리즘이란? (최장 공통 부분 수열)
LCS는 longest common subsequence의 약자입니다. 우리나라 말로는 최장 공통 부분 수열을 의미합니다. 이해하기 쉽도록 longest common substring 과 비교해보겠습니다. substring은 연속된 부분 문자열이고 su..
gusdnr69.tistory.com
해당 문제에서는 부분수열을 출력해야합니다.
이때 역순으로 올라가면서 하나씩 저장해준후에,
역순으로 출력해주면 됩니다.
아래는 알파벳을 저장하는 코드입니다.
int col = a.size() - 1;
int row = b.size() - 1;
while (dp[row][col]) {
if (dp[row][col] == dp[row - 1][col]) {
row--;
}
else if (dp[row][col] == dp[row][col - 1]) {
col--;
}
else {
result += a[col];
row--, col--;
}
}
아래는 전체 정답코드입니다.
#include<iostream>
#include <string>
#include <algorithm>
using namespace std;
string a, b;
string result;
int dp[1001][1001] = { 0, };
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
string temp1, temp2;
cin >> temp1;
cin >> temp2;
a = ' ' + temp1;
b = ' ' + temp2;
for (int i = 1; i < b.size(); i++) {
for (int j = 1; j < a.size(); j++) {
if (a[j] == b[i]) dp[i][j] = dp[i - 1][j - 1] + 1;
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
int col = a.size() - 1;
int row = b.size() - 1;
while (dp[row][col]) {
if (dp[row][col] == dp[row - 1][col]) {
row--;
}
else if (dp[row][col] == dp[row][col - 1]) {
col--;
}
else {
result += a[col];
row--, col--;
}
}
cout << dp[b.size() - 1][a.size() - 1] << endl;
if (result.size() > 0) {
reverse(result.begin(), result.end());
cout << result << endl;
}
return 0;
}
a와 b 앞에 ' '를 추가해주면서 1base로 시작할 수 있도록 만들었습니다.
반응형
'알고리즘 > DP' 카테고리의 다른 글
[백준] 2698-인접한 비트의 개수(C++) (0) | 2021.01.07 |
---|---|
[백준] 9251-LCS(C++) (0) | 2021.01.06 |
[백준] 5502-팰린드롬(C++) (0) | 2021.01.05 |
[백준] 1577-도로의 개수(C++) (0) | 2021.01.04 |
[백준] 1301-비즈 공예(C++) (0) | 2021.01.01 |