문제 : https://www.acmicpc.net/problem/17218
[ 알고리즘풀이 ]
2차원 DP 배열을 이용해서 문제를 해결할 수 있습니다. 입력되는 첫 번째 문자배열을 A, 두 번째 문자배열을 B라고 하겠습니다.
DP[X][Y] : A의 0 ~ X번 째, B의 0 ~ Y번 째까지 중 가장 긴 부분 공통 문자배열.
DP[i][j]
-A[i]와 B[j] 같다면, DP[i - 1][j - 1]에다가 A[i] 를 더한 문자배열.
-A[i]와 B[j]가 다르다면, DP[i][j] 는 DP[i - 1][j] 와 DP[i][j - 1] 중 더 긴 문자배열.
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
string A, B, dp[40][40] = {};
cin >> A >> B;
bool check = false;
//초기값
for (int i = 0; i < A.length(); i++)
if (A[i] == B[0] || check){
dp[i][0] = B[0];
check = true;
}
check = false;
//초기값
for (int j = 0; j < B.length(); j++)
if (A[0] == B[j] || check){
dp[0][j] = A[0];
check = true;
}
//DP배열
for (int i = 1; i < A.length(); i++) {
for (int j = 1; j < B.length(); j++) {
if (A[i] == B[j]) {
dp[i][j] = dp[i - 1][j - 1] + A[i];
}
else {
if (dp[i - 1][j].length() < dp[i][j - 1].length())
dp[i][j] = dp[i][j - 1];
else
dp[i][j] = dp[i - 1][j];
}
}
}
cout << dp[A.length() - 1][B.length() - 1];
return 0;
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 17281 : 야구 - travelbeeee (0) | 2020.02.14 |
---|---|
[BOJ] 1049 : 기타줄 - travelbeeee (0) | 2020.02.13 |
[BOJ] 17219 : 비밀번호 찾기 - travelbeeee (0) | 2020.02.13 |
[BOJ] 17135 : 캐슬 디펜스 - travelbeeee (0) | 2020.02.13 |
[BOJ] 17069 : 파이프 옮기기 2 - travelbeeee (0) | 2020.02.13 |