N

(백준 c++)1509 팰린드롬 분할 본문

백준 알고리즘

(백준 c++)1509 팰린드롬 분할

naeunchan 2021. 1. 12. 12:02
728x90
반응형

문제

세준이는 어떤 문자열을 팰린드롬으로 분할하려고 한다. 예를 들어, ABACABA를 팰린드롬으로 분할하면, {A, B, A, C, A, B, A}, {A, BACAB, A}, {ABA, C, ABA}, {ABACABA}등이 있다.

분할의 개수의 최솟값을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 문자열이 주어진다. 이 문자열은 알파벳 대문자로만 이루어져 있고, 최대 길이는 2,500이다.

출력

첫째 줄에 팰린드롬 분할의 개수의 최솟값을 출력한다.

 

 

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main(void){
    string s;
    vector<vector<int>> dp(2501, vector<int>(2501, 0));
    vector<int> count(2501, 0);
    int size = 0;

    cin >> s;
    s.insert(0, " ");
    
    size = s.size();

    //dp를 통한 회문 검사
    //1글자 회문
    for(int i = 1; i < size; i++){
        dp[i][i] = 1;
    }

    //2글자 회문
    for(int i = 1; i < size; i++){
        if(s[i] == s[i + 1]){
            dp[i][i + 1] = 1;
        }
    }

    //3글자 이상 회문
    for(int i = 2; i < size; i++){
        for(int j = 1; j <= size - i; j++){
            if(s[j] == s[i + j] && dp[j + 1][i + j - 1]){
                dp[j][i + j] = 1;
            }
        }
    }

    //최소 분할 개수 구하기
    for(int i = 1; i < size; i++){
        count[i] = 999999999;
        for(int j = 1; j <= i; j++){
            if(dp[j][i]){
                count[i] = count[i] < count[j - 1] + 1 ? count[i] : count[j - 1] + 1;
            }
        }
    }
 
	cout << count[size - 1];
    return 0;
}
728x90
반응형

'백준 알고리즘' 카테고리의 다른 글

(백준 c++)2623 음악 프로그램  (0) 2021.01.13
(백준 c++)2252 줄 세우기  (0) 2021.01.13
(백준 c++)9935 문자열 폭발  (0) 2021.01.11
(백준 c++)3079 입국심사  (0) 2021.01.11
(백준 c++)16234 인구 이동  (0) 2021.01.10