본문으로 바로가기

[DP] 9251번 LCS

category Algorithm/BOJ 문제풀이 2019. 2. 7. 16:20
9251_LCS

9251번 LCS

 

https://www.acmicpc.net/problem/9251


 

문제

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.

예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

 

입력

첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.

 

출력

첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.

 

예제 입력

ACAYKP
CAPCAK

 

예제 출력

4

 

해결방법

LCS(Longest Common Subsequence) 를 적용한 DP 문제이다

 

 

⭐️ 솔루션 ⭐️

Longest Common Subsequence 는 common subsequence 중에서 길이가 가장 긴 것을 뜻한다

예를 들어, ABCBDAB , BDCABA 두 문자열의 LCS 는 BCBA 가 된다

 

  • 2개의 문자열의 요소를 각각 비교해야하므로 2차원 배열을 준비한다
  • 또한 각 비교시, 두 문자열의 요소가 일치하는 경우와 일치하지 않는 경우의 점화식을 다르게 세워 모든 요소를 비교한다
  • 점화식은 아래와 같다
L[i,j] = { 0							(i=0 or j=0)
         { L[i-1][j-1] + 1				(xᵢ = yᵢ)
         { max(L[i-1][j], L[i][j-1])	(xᵢ != yᵢ)

 

 

 

소스코드

#include <iostream>
#include <algorithm>
using namespace std;

string s1,s2;
int d[1001][1001];

void dp(){
    for(int i=1; i<=s1.size(); i++){
        for(int j=1; j<=s2.size(); j++){
            if(s1[i-1] == s2[j-1]){
                d[i][j] = d[i-1][j-1] + 1;
            }else{
                d[i][j] = max(d[i-1][j],d[i][j-1]);
            }
        }
    }
    
    cout << d[s1.size()][s2.size()] << "\n";
}

int main(int argc, const char * argv[]) {
    // cin,cout 속도향상
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    cin >> s1 >> s2;
    
    dp();
    
    return 0;
}

'Algorithm > BOJ 문제풀이' 카테고리의 다른 글

[DP] 1958번 LCS3  (0) 2019.02.07
[DP] 9252번 LCS2  (0) 2019.02.07
[DP] 2294번 동전2  (0) 2019.02.06
[DP] 2293번 동전1  (0) 2019.02.06
[DP] 11052번 카드 구매하기  (0) 2019.02.06