-
백준 1958번 : LCS 3알고리즘 공부 2020. 4. 23. 16:08
LCS를 한 번이라도 풀어봤다면 어려운 문제는 아니다. 단지 3차원 배열을 사용해야 하기 때문에 시각적으로 표현하기가 어려울 뿐..! 더 자세한 풀이는 아쉽게도 내 블로그에 적어놓은 글 중에는 LCS 관련 풀이가 없어서 그나마 비슷한 공통부분문자열(https://stillchobo.tistory.com/92)을 참고하면 좋을 것 같다.
아래 풀이는 공통부분문자열의 풀이에서 발전된 형태다. 복잡할 것 없이 dp의 값이 증가하는 경우는 단 하나 밖에 없다.
문자가 같을 때! 이때 dp의 값은 1 증가하게 된다. 다시 한 번 말하지만 dp의 값이 변화하는 때는 이 때 뿐이다.
dp[i][j][k] = dp[i-1][j-1][k-1] + 1
이제 그 외의 경우(문자가 같지 않을 때)를 처리해주면 된다. 공통부분문자열과는 다르게 분절적이여도 되기 때문에 이전 값들 중 최댓값을 할당해준다.
#include <iostream> using namespace std; string a, b, c; int dp[102][102][102]; int strlen(string str) { int len = 0; while(str[len]) len += 1; return len; } int main() { cin >> a >> b >> c; int a_len = strlen(a); int b_len = strlen(b); int c_len = strlen(c); int ans = 0; for(int i = 1; i <= a_len; i++) { for(int j = 1; j <= b_len; j++) { for(int k = 1; k <= c_len; k++) { if(a[i-1] == b[j-1] && b[j-1] == c[k-1]) dp[i][j][k] = dp[i-1][j-1][k-1] + 1; else { dp[i][j][k] = max(dp[i-1][j][k], dp[i][j-1][k]); dp[i][j][k] = max(dp[i][j][k], dp[i][j][k-1]); } ans = max(ans , dp[i][j][k]); } } } cout << ans; return 0; }
'알고리즘 공부' 카테고리의 다른 글
백준 1328번 : 고층 빌딩 (0) 2020.04.26 백준 2688번 : 줄어들지 않아 (0) 2020.04.24 백준 1256번 : 사전 (0) 2020.04.22 백준 11051번 : 이항 계수 (0) 2020.04.21 백준 7579번 : 앱 (0) 2020.04.17