www.acmicpc.net/problem/9251

 

9251번: LCS

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

www.acmicpc.net


  • 두 문자열을 비교하는 N x N 의 동적 배열을 생성해준다.
  • 배열[r][c] 은 해당 문자열의 [0 ~ r] 과 다른 문자열의 [0 ~ c] 까지의 LCS 이다.
  • 문자열을 비교해나가면서 같은 문자열이 나올 때 마다 직전 LCS 값에서 1을 더해준다.
  • 문자열이 다르더라도, 그 전 까지의 LCS 값은 그대로 유지되기 때문에 값을 똑같이 이어나가준다.
  • 다이나믹 프로그래밍은 어디에서나 쓰이는 듯 하다.

#include <iostream>
#include <string>

using namespace std;

string a, b;
int answer;
int dp[1001][1001];

int main(void)
{
    cin >> a >> b;
    a = '0' + a;        // 문자열 인덱스를 배열과 똑같이 맞추기 위해서 앞에 쓰레기문자 붙임
    b = '0' + b;
    
    for(int r = 1 ; r < b.size() ; r++)     // 인덱스는 1부터 시작
    {
        for(int c = 1 ; c < a.size() ; c++)
        {
            if(a[c] == b[r]) dp[r][c] = dp[r-1][c-1] + 1;   // 같은 문자가 나오면 직전 LCS 값 + 1
            else dp[r][c] = dp[r][c-1] > dp[r-1][c] ? dp[r][c-1] : dp[r-1][c];  // 아닐 경우 왼쪽 / 위쪽 값 중 큰 값 선택

            if(dp[r][c] > answer) answer = dp[r][c];        // 최대 길이 갱신
        }
    }
    cout << answer << endl;
}

 

'PS > BOJ' 카테고리의 다른 글

[백준] 12851.cpp : 숨바꼭질 2  (0) 2020.08.27
[백준] 9663.cpp : N-Queen  (0) 2020.08.26
[백준] 1916.cpp : 최소비용 구하기  (0) 2020.08.21
[백준] 1753.cpp : 최단경로  (0) 2020.08.20
[백준] 1043.cpp : 거짓말  (0) 2020.08.17

+ Recent posts