Algorithm/BOJ

[BOJ] LCS(9251)

vividswan 2022. 3. 12. 20:06

[λ°±μ€€(BOJ)] LCS(9251) C++

문제 : BOJ_9251번 LCS

문제 μ„€λͺ…

DP

μ΅œλŒ€ 1000 κΈ€μžμ˜ 두 단어가 주어지고, 두 λ‹¨μ–΄μ—μ„œ κ³΅ν†΅λœ λΆ€λΆ„ μˆ˜μ—΄ 쀑 κ°€μž₯ κΈ΄ μˆ˜μ—΄μ„ μ°ΎλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

문제 μžμ²΄λŠ” κ°„λ‹¨ν•˜μ§€λ§Œ, μ™„μ „ 탐색을 μ΄μš©ν•˜λ©΄ μ‹œκ°„ μ΄ˆκ³Όκ°€ λ‚˜κΈ° λ•Œλ¬Έμ— DPλ₯Ό ν™œμš©ν•˜μ—¬ ν•΄κ²°ν•΄μ•Ό ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.


Solution


μœ„ ν‘œλ₯Ό μ°Έκ³ ν•΄μ„œ DP 식을 μ§œμ•Ό ν•©λ‹ˆλ‹€.

두 λ¬Έμžμ—΄μ˜ 길이만큼 2쀑 for 문을 μˆœνšŒν•˜λ©΄μ„œ λ¬Έμžκ°€ 같을 λ•Œμ™€ λ‹€λ₯Ό λ•Œ 두 쑰건으둜 dp 식을 μ„Έμ›Œμ€λ‹ˆλ‹€.

두 λ¬Έμžμ—΄μ΄ κ°™λ‹€λ©΄, dp[i][j] = dp[i-1][j-1]+1

즉, μœ„ ν‘œμ—μ„œ λŒ€κ°μ„ μ˜ dp κ°’ + 1μž…λ‹ˆλ‹€.

두 λ¬Έμžμ—΄μ΄ λ‹€λ₯΄λ‹€λ©΄, dp[i][j] = max(dp[i][j-1], dp[i-1][j])

즉, μœ„ ν‘œμ—μ„œμ˜ μ™Όμͺ½μ΄λ‚˜ μœ„μͺ½ κ°’μ˜ μ΅œλŒ“κ°’μž…λ‹ˆλ‹€.

두 값이 같지 μ•Šλ‹€λ©΄, κ·Έμ „ dp κ°’ 쀑 μ΅œλŒ“κ°’μ΄ λ“€μ–΄κ°€μ•Ό ν•˜λŠ”λ°, ν‘œμ˜ μ™Όμͺ½μ΄λ‚˜ μœ„μͺ½ κ°’μ˜ μ΅œλŒ“κ°’μ΄ κ·Έ 값이기 λ•Œλ¬Έμž…λ‹ˆλ‹€.


Description

  • λ¬Έμžμ—΄μ€ 0번 μΈλ±μŠ€λΆ€ν„° μ‹œμž‘ν•˜λ―€λ‘œ, 이λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ dp 값은 i와 j에 1μ”© λ”ν•΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.
  • κ·ΈλŸ¬λ―€λ‘œ μ΅œμ’… 좜λ ₯값도 dp[1번 λ¬Έμžμ—΄μ˜ 길이-1][2번 λ¬Έμžμ—΄μ˜ 길이-1]이 μ•„λ‹Œ dp[1번 λ¬Έμžμ—΄μ˜ 길이][2번 λ¬Έμžμ—΄μ˜ 길이]μž…λ‹ˆλ‹€.

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
char str1[1001], str2[1001];
int dp[1001][1001];
int main(void){
    cin >> str1 >> str2;
    for(int i=0; str1[i]!='\0'; i++){
        for(int j=0; str2[j]!='\0'; j++){
            if(str1[i]==str2[j]){
                dp[i+1][j+1]=dp[i][j]+1;
            }
            else {
                dp[i+1][j+1]= max(dp[i][j+1],dp[i+1][j]);
            }
        }
    }
    cout << dp[strlen(str1)][strlen(str2)] << '\n';
    return 0;
}