Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

dh-winternagi 님의 블로그

(9252) LCS 2 본문

백준 (C++)/Solve

(9252) LCS 2

dh-winternagi 2026. 4. 20. 00:59

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

단계별로 풀어보기

32단계(동적 계획법과 최단거리 역추적) 4번째

 

 

 

DP 갱신의 특수성 때문에 반대로 from 없이 dp배열만으로도 역추적이 가능한 문제.

문자가 겹쳐야 dp값이 갱신되므로 dp[x][y]에서 dp[x+1][y+1]로 넘어갈 때는 값이 1 증가하고, dp[x+1][y]나 dp[x][y+1]로 넘어갈 때는 값이 증가하지 않는 지점이 생긴다. 이 지점의 문자를 가져오면 된다.

 

 

 

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

int main() 
{
  string s1, s2;
  
  cin >> s1 >> s2;
  
  vector dp(s1.length()+1, vector<int> (s2.length()+1));
  
  for(int i=1;i<=s1.length();i++){
    for(int j=1;j<=s2.length();j++){
      dp[i][j]= max(dp[i-1][j], dp[i][j-1]);
      if(s1[i-1]==s2[j-1])  dp[i][j]= max(dp[i][j], dp[i-1][j-1]+1);
    }
  }
  
  int x= s1.length(), y= s2.length();
  string res;
  
  cout << dp[x][y] << "\n";
  
  while(x&&y){
    if(dp[x-1][y]==dp[x][y]){
      x--;
    }else if(dp[x][y-1]==dp[x][y]){
      y--;
    }else{
      x--;
      y--;
      res= s1[x]+res;
    }
  }
  
  cout << res;
  
  return 0;
}

'백준 (C++) > Solve' 카테고리의 다른 글

(13913) 숨바꼭질 4  (0) 2026.04.20
(2618) 경찰차  (0) 2026.04.20
(14003) 가장 긴 증가하는 부분 수열 5  (0) 2026.04.20
(14002) 가장 긴 증가하는 부분 수열 4  (0) 2026.04.20
(12852) 1로 만들기 2  (0) 2026.04.20