https://www.acmicpc.net/problem/1509
1509번: 팰린드롬 분할
세준이는 어떤 문자열을 팰린드롬으로 분할하려고 한다. 예를 들어, ABACABA를 팰린드롬으로 분할하면, {A, B, A, C, A, B, A}, {A, BACAB, A}, {ABA, C, ABA}, {ABACABA}등이 있다. 분할의 개수의 최솟값을 출력하
www.acmicpc.net
[난이도] Gold1
[유형] DP
[풀이]
dp[l][r] : s[l~r]가 팰린드롬이면 1, 아니면 0
dp2[i] : 문자열의 길이가 N일때, 부분문자 s[i~(N-1)] 에서 분할 개수의 최솟값
dp[2501][2501]을 dp를 이용해 구한 뒤,
이를 이용해 dp2[2501]도 dp로 구해주면 됩니다.
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
string s;
int N,dp[2501][2501],dp2[2501];
int sol(int l,int r){
if(l>=r) return 1;
int& ret = dp[l][r];
if(ret!=-1) return ret;
if(s[l]==s[r]) ret=sol(l+1,r-1);
else ret=0;
return ret;
}
int sol2(int n){
if(n==N) return 0;
int& ret = dp2[n];
if(ret!=-1) return ret;
ret=9e8;
for(int i=n;i<N;i++)
if(dp[n][i]) ret=min(ret,1+sol2(i+1));
return ret;
}
int main(){
cin >> s;
N=s.size();
memset(dp,-1,sizeof(dp));
memset(dp2,-1,sizeof(dp2));
for(int i=0;i<s.size()-1;i++)
for(int j=i+1;j<s.size();j++) sol(i,j);
cout << sol2(0);
}
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold1/1509.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold5] 19940 : 피자 오븐 (C++) (0) | 2022.05.13 |
---|---|
[BOJ/백준][Gold5] 2011 : 암호코드 (C++) (0) | 2022.05.13 |
[BOJ/백준][Gold5] 19942 : 다이어트 (C++) (1) | 2022.05.13 |
[BOJ/백준][Platinum5] 2568 : 전깃줄 - 2 (C++) (0) | 2022.05.13 |
[BOJ/백준][Gold1] 1562 : 계단 수 (C++) (0) | 2022.03.27 |