이 문제는 다이나믹 프로그래밍으로 꼭 풀어야 하는건 아니다.
문자열의 i ~ j 구간의 팰린드롬 여부를 파악하도록 DP를 구성했다.
문자열의 끝에 0개 이상의 문자를 붙여서, 팰린드롬이 이루어지는지 볼려면, 모든 구간을 보는 것이 아니라,
0 <= i < S.length()
i에서부터 S.length() - 1까지 문자열이 팰린드롬인지 확인해서 붙어야 하는 문자 수를 파악하면 된다.
이 외의 구간들에 대해서는 팰린드롬인지 확인하는 것은 불필요하다.
해설코드(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
25
26
27
28
29
30
31
32
33
34
|
#include <iostream>
using namespace std;
string S;
int dp[1001][1001];
int main() {
cin >> S;
for(int i = 0; i < S.length(); i++){
dp[i][i] = 1;
}
for(int i = 0; i < S.length() - 1; i++){
if(S[i] == S[i + 1])
dp[i][i + 1] = 1;
}
for(int k = 2; k < S.length(); k++){
for(int i = 0; i < S.length(); i++){
if(dp[i + 1][i + k - 1] == 1 && S[i] == S[i + k])
dp[i][i + k] = 1;
}
}
int answer = -1;
for(int i = 0; i < S.length(); i++){
if(dp[i][S.length() - 1] == 1){
answer = max(answer, (int)S.length() - i);
}
}
cout << answer + (S.length() - answer) * 2 << endl;
return 0;
}
|
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ 2688] 줄어들지 않아 (0) | 2020.05.22 |
---|---|
[BOJ 2309] 일곱 난쟁이 (0) | 2020.05.19 |
[BOJ 1562] 계단 수 (0) | 2020.05.17 |
[BOJ 2618] 경찰차 (0) | 2020.05.15 |
[BOJ 1256] 사전 (0) | 2020.05.05 |