PS

백준 1509 팰린드롬 분할

jyheo98 2020. 8. 4. 06:29

우선 dp를 돌기 전에 isPal 이차원 배열을 만들어 놓고, L번째 index와 R번째 index 사이의 string이 palindrome이 맞으면 1, 아니면 0을 저장한다. 

 

그리고 dp[index] = index에서 시작하여 string 끝까지 만들 수 있는 최소 팰린드롬 분할 갯수라고 정의하자.

즉 우리가 알고싶은 답은 dp[0]의 값이다.

 

i를 index~string 끝까지 돌렸을 떄 isPal[index][i]가 1이라면, index~i까지는 palindrome이라고 할 수 있고, 그 뒤에 남은 string에 대해 최솟값을 구해주는 식으로 짜면 된다.

 

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
string s;
vector<int> dp;
vector<vector<int>> isPal;
int dfs(int index) {
    if (index == s.length()) return 0;
    int& ret = dp[index];
    if (ret != -1return ret;
    ret = INF;
    rep(i, index, s.length()) {
        if (isPal[index][i] == 1) {
            ret = min(ret, 1 + dfs(i + 1));
        }
    }
    return ret;
 }
bool isPall(string ss) {
    rep(i, 0, ss.length()) {
        if (ss[i] != ss[ss.length() - 1 - i]) return 0;
    }
    return 1;
}
 
int main() {
    cin >> s;
    isPal = VVI(s.length(), VI(s.length()));
    dp = vector<int>(s.length(), -1);
    rep(i, 0, s.length()) {
        rep(j, i, s.length()) {
            string ss = s.substr(i, j - i + 1);
            if (isPall(ss)) isPal[i][j] = 1;
        }
    }
    
    cout << dfs(0);
    return 0;
}
cs