무려 DP를 2번이나 구현해야하는 문제이다.
#include <iostream>
#include <vector>
#include <string>
#include <climits>
using namespace std;
int main() {
string s;
cin >> s;
int l = s.length();
bool palindrome[2501][2501] = {false};
for (int i = 0; i < l; i++) { // 1개일때 모두 트루
palindrome[i][i] = true;
}
for (int j = 1; j < l; j++) {
for (int i = 0; i < j; i++) {
if (s[i] == s[j]) {
if (j - i == 1) {
palindrome[i][j] = true; // 2개일때(aa)
} else {
palindrome[i][j] = palindrome[i + 1][j - 1]; //OㅁㅁㅁㅁㅁO
}
}
}
}
vector<int> ans(l, INT_MAX); // 0부터 n까지의 최소 분할 개수 저장
for (int j = 0; j < l; j++) {
if (palindrome[0][j]) ans[j] = 1; // 0~j까지가 true면 1로 끝.
else {
for (int i = 1; i <= j; i++) {
if (palindrome[i][j]) ans[j] = min(ans[j], ans[i-1] + 1); // 분할됐으므로 +1
}
}
}
cout << ans[l - 1];
return 0;
}
참고
https://byeo.tistory.com/entry/boj-1509-%ED%8C%B0%EB%A6%B0%EB%93%9C%EB%A1%AC-%EB%B6%84%ED%95%A0