문제 링크
- http://icpc.me/1509
사용 알고리즘
- DP
시간복잡도
- O(N2)
풀이
이 문제는 두 가지 부분 문제로 나눌 수 있습니다.
- 팰린드롬을 빠르게 판별하는 문제
- 분할 개수의 최솟값을 구하는 문제
팰린드롬을 빠르게 판별하는 것은 DP로 할 수 있습니다.
[S, E]구간이 팰린드롬인지 판별하는 것은 보통 while문을 사용합니다.
while문 대신 재귀 형태로 구현한 다음에 메모이제이션을 해주면 상태 공간은 총 O(N2)개, 각 상태마다 O(1)에 답을 구할 수 있으므로 O(N2)만에 모든 구간에 대해 팰린드롬인지 판별할 수 있습니다.
분할 개수의 최솟값을 구하는 것도 DP로 할 수 있습니다.
dp[n] = [1, n]구간을 분할하는 최소 개수 라고 정의합시다.
만약 [j, i]구간이 팰린드롬이라면, [1, j-1]까지 잘 분할하고, [j, i]를 한 덩어리로 만들어주면 됩니다.
그러므로 dp[i] = min(dp[j-1] + 1)으로 답을 구해줄 수 있습니다. (단, j <= i and [j, i]는 팰린드롬)
전체 코드
1 |
|