Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
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
Archives
Today
Total
관리 메뉴

dh-winternagi 님의 블로그

(1509) 팰린드롬 분할 본문

백준 (C++)/Solve

(1509) 팰린드롬 분할

dh-winternagi 2026. 4. 26. 13:35

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

단계별로 풀어보기

50단계(동적 계획법 4) 1번째

 

 

 

pal[i][j]를 입력된 문자열의 i~j번째 글자가 팰린드롬을 이루는지 여부를 나타내는 불리언 변수라고 하자.

pal[i][j]는 i번째 글자와 j번째 글자가 같고, j-i≤1(같은 글자거나 바로 옆)이거나 pal[i+1][j-1]이 true일 때 true다.

이 방식으로 O(N^2)에 pal을 전처리할 수 있다.

 

dp[i]를 i번째 글자까지 팰린드롬 분할 가능한 최소값이라고 하자.

pal[x][i]가 true일 때 x~i번째 글자가 하나의 팰린드롬이고 1~x-1번째 글자를 다시 분할해야 하므로 dp[i]= max(dp[i], dp[x-1]+1)이 된다. 이 비교를 x가 1~i일 때에 대해 하면 dp[i]를 구할 수 있다. 시간복잡도는 O(N^2)이다.

 

 

 

#include <iostream>
#include <vector>
using namespace std;

int main() {
  string s;
  
  cin >> s;
  
  int len= s.length();
  
  vector<int> dp(len+1);
  vector pal(len+1, vector<bool> (len+1));
  
  for(int i=0;i<len;i++){
    for(int j=1;j+i<=len;j++){
      pal[j][j+i]= (s[j-1]==s[j+i-1] && (i<=1||pal[j+1][j+i-1]));
    }
  }
  
  for(int i=1;i<=len;i++){
    dp[i]= i;
    
    for(int j=1;j<=i;j++){
      if(pal[j][i])  dp[i]= min(dp[i], dp[j-1]+1);
    }
  }
  
  cout << dp[len];
  
  return 0;
}

'백준 (C++) > Solve' 카테고리의 다른 글

(13392) 방법을 출력하지 않는 숫자 맞추기  (0) 2026.04.26
(2169) 로봇 조종하기  (0) 2026.04.26
(11012) Egg  (0) 2026.04.26
(7626) 직사각형  (0) 2026.04.26
(17131) 여우가 정보섬에 올라온 이유  (0) 2026.04.26