Compy's Blog
449 words
2 minutes
[BOJ] 팰린드롬 분할
2025-03-28

팰린드롬 분할

TimeLimitMemoryLimitConditionTAG
2s128MB(1 ≤ N ≤ 2500)Dynamic Programming

코드 처음할 때 3차원으로 정의해놓고.. 쓰다보니까 그냥 아니라서 혼자 생각해서 풀었는데요

dp[i][j]는 i - j + 1부터 i까지 점프를 뛸 때(즉 팰린드롬일 때) 최소 값을 저장하고 이후에 돌면서 최솟값 업데이트해주고 그걸로 시간초과 피하면서 처리하면 AC!

정답 코드
#include <iostream>
#define inf 2100000000

using namespace std;
using ll = long long;

int dp[2501][2501]; // [i][j][k] i번째 수일 때 i - j까지의 연속된 순서가 팰린드롬일 때 현재 나눠진 팰린드롬의 개수
int visited[2501];

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    string input;
    
    cin >> input;
    int result = (int) input.size();
    
    int n = result;
    // 먼저 자기 자신 일단 넣어두고, 다음으로
    
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++) dp[i][j] = inf;
    }
    
    for(int i = 0; i <= n; i++) dp[0][i] = 0;
    dp[1][1] = 1;
    
    visited[0] = 0;
    visited[1] = 1;
    
    for(int i = 2; i <= n; i++){
        dp[i][1] = min(dp[i-1][1] + 1, dp[i-1][2]);
        visited[i] = inf;
        
        
    }
//        dp[i][
        
////    }
//    
//    
    for(int i = 2; i <= n; i++){
        
        for(int k = 1; k <= i; k++) {
            dp[i][1] = min(dp[i][1], dp[i-1][k] + 1);
            visited[i] = min(visited[i], dp[i][1]);
        }
        
        
        for(int j = 1; j < i; j++){
            
            
            
            if(input[j - 1] != input[i - 1]) continue;

//            else {
//                if(input[i-j-1] == 'R'){
//                    cout <<i << " "<< j << "\n";
//                }
//            }
            if(dp[i - 1][i - j - 1] >= inf) continue;
            
//            cout << "check: " << input[i-j-1] << " " << input[i] << "\n";
//            cout << "dp: " << dp[i-1][j-1] << "\n";
//
            dp[i][i - j + 1] = min(dp[i][i - j + 1], visited[j-1]+1);
            visited[i] = min(dp[i][i-j+1], visited[i]);
            
        }
    }
    
//    
//    for(int i = 1; i <= n; i++){
//        for(int j = 1; j <= n; j++){
//            if(dp[j][i] == inf) cout << "O ";
//            else cout << dp[j][i] << " ";
//        }
//        cout << "\n";
//    }
    
    cout << visited[n];
    
    
}
// ABACAAB
// QWERTYTREWQWERT


// DCADD
// 16
// BBCDDECAECBDABADDCEBACCCBDCAABDBADD
// BBCDDECAECBDABADDCEBACCCBDCAABDBADD
[BOJ] 팰린드롬 분할
https://compy07.github.io/Blog/posts/boj/1509/
Author
뒹굴뒹굴 이정훈 공부방
Published at
2025-03-28