풀이
백트래킹 + DP
A,B 두 문자열을 받고 각각의 index를 분리해서 메모했다.
DP[indexA][indexB] : A 문자열의 indexA번째 문자부터 끝까지와 B 문자열의 indexB번째 문자부터 끝까지 중 가장 긴 LCS의 길이
라고 DP를 정의했다.
백트래킹으로 탐색하며 DP를 채워나가도록 처리했다.
A[idxA]와 B[idxB]가 같은지 확인한다.
- 같다면 초기값을 1+ (idxA+1,idxB+1)에서의 LCS
- 다르다면 (idxA+1,idxB) 과 (idxA,idxB+1)에서의 LCS 중 큰 값
1에서 얻은 결과들 중 가장 큰 값을 현재 index에서의 LCS로 메모한다.
idxA와 idxB가 문자열 끝까지 갔다면 0을 리턴한다.
처음부터 끝까지 두개의 문자열 모두 탐색하면 최댓값을 구할 수 있다.
코드
//! 2020.03.17
// TODO BJ9251_LCS
#include<iostream>
#include<string>
using namespace std;
const int MAX = 1050;
int DP[MAX][MAX];
string A,B;
int getMax(int n1,int n2){
if(n1>n2) return n1;
else return n2;
}
int getResult(int idxA,int idxB){
if(idxA>=A.size() || idxB>=B.size()) return 0;
int& ret = DP[idxA][idxB];
if(ret!=-1) return ret;
if(A[idxA]==B[idxB]){
ret = 1+getResult(idxA+1,idxB+1);
}
else ret = 0;
ret = getMax(ret,getResult(idxA+1,idxB));
ret = getMax(ret,getResult(idxA,idxB+1));
return ret;
}
int main(){
freopen("input.txt","r",stdin);
getline(cin,A);
getline(cin,B);
for(int i=0;i<A.size();i++){
for(int j=0;j<B.size();j++){
DP[i][j] = -1;
}
}
cout << getResult(0,0) << endl;
return 0;
}
'SW > 알고리즘 문제풀이' 카테고리의 다른 글
BJ11729 하노이 탑 이동 순서 (0) | 2020.03.21 |
---|---|
BJ12865 평범한배낭 (0) | 2020.03.17 |
BJ2565 전깃줄 (0) | 2020.03.17 |
BJ1149 RGB거리 (0) | 2020.03.12 |
BJ9461 파도반 수열 (0) | 2020.03.12 |
Comment