간단한 문제인데 벙쪄있었다. 왜 그랬을까?
아마도 dp를 공통 부분 문자열의 최장 길이로 정의할려다가 보니 점화식을 못세워서 뇌정지가 왔던 거 같다..
이 문제를 풀기 위해서는, 점화식을 세워야 한다.
S1과 S2의 각 각 인덱스를 i와 j라고 하자. dp는 S1[i]와 S2[j]가 공통 부분 문자열의 마지막 부분일 때, 공통 부분 문자열의 길이의 값이다.
dp[i][j] = dp[i - 1][j - 1] + 1 (S1[i] == S2[j])
dp[i][j] = 0 (S1[i] != S2[j])
위의 점화식을 통해서 코드를 작성하면 된다.
해설코드(C++).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include <iostream>
#include <cstring>
using namespace std;
string s1, s2;
int dp[4001][4001] = { 0 };
int result = 0;
int main() {
cin >> s1 >> s2;
dp[i][j] = 0;
if(s1[i - 1] == s2[j - 1]){
dp[i][j] = 1 + dp[i - 1][j - 1];
result = max(result, dp[i][j]);
}
}
}
cout << result << endl;
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ 2352] 반도체 설계(이분탐색) (0) | 2020.04.25 |
---|---|
[BOJ 2169] 로봇 조종하기 (0) | 2020.04.25 |
[BOJ 1038] 감소하는 수(다이나믹 프로그래밍, 수학 풀이) (0) | 2020.04.20 |
[BOJ 9084] 동전 (1) | 2020.04.19 |
[BOJ 11060] 점프 점프 (0) | 2020.04.18 |