본문 바로가기
PS/BOJ

백준 9251 / C++

by jaehoonChoi 2022. 7. 21.

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

 

9251번: LCS

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

www.acmicpc.net

 

[ 풀이 ] 

 

dp[i][j]를 문자열 1개를 i번을 볼 것이고 , 나머지를 j번을 보려고 할 때  지금까지 겹치는 것의 개수라고 하자. 

겹치지 않으면 한 문자열을 한칸 이동시켜준다. 

겹치면 두 문자열을 모두 한칸 이동시켜준다. 

dp[i][j]=max(dp[i+1][j], dp[i][j+1], if a[i]=b[j],  dp[i+1][j+1]+1) 로 쓸 수 있다.

 

[ 코드 ] 

 

#include <bits/stdc++.h>
using namespace std;
int n, dp[1001][1001];
string a, b;
 
int go(int i, int j) {
    if (i == a.size() || j == b.size()) return 0;
    int& ret = dp[i][j];
    if (ret != -1) return ret;
    ret = -1e9;
    ret = max(go(i + 1, j), go(i, j + 1));
    if (a[i] == b[j]) ret = max(ret, go(i + 1, j + 1) + 1);
    return ret;
}
 
int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> a >> b;
    memset(dp, -1, sizeof(dp));
    cout << go(0, 0) << '\n';
}

 

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

백준 6062 / C++  (0) 2022.07.21
백준 1520 / C++  (0) 2022.07.21
백준 10942 / C++  (0) 2022.07.21
백준 13975 / C++  (0) 2022.07.21
백준 12099 / C++  (0) 2022.07.15

댓글