반응형

문제 출처 :


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



알고리즘 분석 :


문제 해결에 필요한 사항

1. Dynamic Programming

2. 점화식 세우는 방법


팰린드롬인지 확인하는 O(n^2) 코드는 다음 링크에서 확인이 가능하다.


http://www.crocus.co.kr/1001


이제 위의 코드를 이용하여 문제를 해결해보자.



DP[i][j]의 의미는 i~j까지 부분 문자열이 팰린드롬인지 아닌지 기록하는 dp이다.


따라서 우리는 k~마지막번째까지의 dp[k][last]가 true인 최초 부분을 찾아준다.


예를들면 abcac가 있다고 보자


이때 팰린드롬 dp[3][5]가 처음으로 true가 될 것이다.(cac)


따라서 우리는 3~5번째는 고려하지 않고, 1,2번째만 현재 문자열 뒤에 추가해주면

이 문자열이 팰린드롬이 될 수 있음을 알 수 있다.(abcacba)





소스 코드 : 


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
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
 
using namespace std;
 
char str[1002];
bool DP[1002][1002];
 
int main()
{
    scanf("%s", str + 1);
    int len = strlen(str + 1);
    for (int i = 1; i <= len; i++)
        DP[i][i] = true;
 
    for (int i = 1; i <= len - 1; i++)
        if (str[i] == str[i + 1])
            DP[i][i + 1= true;
 
    // k칸 다음번째
    for (int k = 2; k <= len - 1; k++)
    {
        // 1부터 ~ n - k 번째 까지
        for (int i = 1; i <= len - k; i++)
        {
            // i + k번째 칸
            int j = i + k;
            if (str[i] == str[j] && DP[i + 1][j - 1])
                DP[i][j] = true;
        }
    }
 
    int val = -1;
    for (int i = 1; i <= len; i++)
        if (DP[i][len])
            val = max(val, len - i + 1);
 
    printf("%d", val + (len - val) * 2);
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus

반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[10942번] 팰린드롬?  (2) 2017.11.23
[1254번] 팰린드롬 만들기  (0) 2017.11.22
[14846번] 직사각형과 쿼리  (4) 2017.11.17
[11066번] 파일 합치기  (0) 2017.11.16
[11495번] 격자 0 만들기  (2) 2017.11.15