Algorithm/DP

BOJ#9251 LCS

밤이2209 2017. 2. 6. 15:22

BOJ#9251 LCS

* 문제

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


LCS(Longest Common Subsequence, 최장 공통 부분 수열)



* 풀이


2개의 문자열의 공통 부분 문자열의 길이를 구하는 문제입니다.

ex) abcd, bd 일 때 -> 공통 부분 문자열은 bd이고 길이는 2


dp 정의는 아래와 같고


dp[i][j] : s_1, ... , s_i와 t_1, ... , t_j에 대한 LCS의 길이



s_1, ... , s_i+1와 t_1, ... , t_j+1에 대해서


1) s_i+1 = t_j+1 이라면

dp[i+1][j+1] = dp[i][j] + 1


2) s_i+1 != t_j+1 이라면

dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j])





* 나의 코드

https://github.com/stack07142/BOJ/tree/master/BOJ%239251_LCS/src


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* BOJ#9251 Longest Common Subsequence
* https://www.acmicpc.net/problem/9251
*/

public class Main {

static int[][] dp = new int[1001][1001]; // i번째 글자가 마지막 글자인 LCS length

public static void main(String[] args) throws IOException {

StringBuffer S;
StringBuffer T;
int sLength, tLength;

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

S = new StringBuffer(br.readLine());
T = new StringBuffer(br.readLine());

sLength = S.length();
tLength = T.length();

for (int i = 0; i < sLength; i++) {

for (int j = 0; j < tLength; j++) {

if (S.charAt(i) == T.charAt(j)) {

dp[i + 1][j + 1] = dp[i][j] + 1;
} else {

dp[i + 1][j + 1] = Math.max(dp[i][j + 1], dp[i + 1][j]);
}
}
}

System.out.println(dp[sLength][tLength]);

} // main
}


'Algorithm > DP' 카테고리의 다른 글

BOJ#1932 숫자삼각형  (0) 2017.02.09
BOJ#1149 RGB거리  (0) 2017.02.08
BOJ#2293 동전1  (0) 2017.01.24
BOJ#11066 파일 합치기 (Merging Files)  (3) 2016.12.23
BOJ#2011 암호코드  (0) 2016.12.12