Palindrome là xâu ký tự mà nếu đọc nó từ trái sang phải cũng như từ phải sang trái ta được cùng một xâu. Một xâu ký tự bất kỳ luôn có thể biểu diễn như là một dãy các palindrome nếu như ta coi xâu chỉ gồm một ký tự luôn là một palindrome. Ví dụ: xâu bobseesanna có thể biểu diễn dưới dạng dãy các palindrome theo nhiều cách, chẳng hạn:
Cho xâu ký tự $S$, cần tìm cách biểu diễn xâu dưới dạng một dãy gồm số ít nhất các palindrome. Ví dụ: cho bobseesanna, do ta có bobseesanna = bob + sees + anna và không thể biểu diễn bobseesanna bởi ít hơn là palindrome nên biểu diễn này chính là biểu diễn cần tìm.
Dữ liệu vào:
Dữ liệu ra:
Ví dụ:
// Input
bobseesanna
// Output
3
Giới hạn:
bool check(int L, int R){
string s1 = "", s2 = "";
for (int i = L; i<= R; i++)
s1 = s1 + s[i];
for (int i = R; i >= L; i--)
s2 = s2 + s[i];
if (s1 == s2) return true;
else return false;
}
#include <bits/stdc++.h>
#define MAX 100004
#define INF (int)(1e9)
#define pii pair<int, int>
#define piii pair<int, pii>
using namespace std;
char s[258];
int f[258];
int n;
bool check(int L, int R){
string s1 = "", s2 = "";
for (int i = L; i<= R; i++)
s1 = s1 + s[i];
for (int i = R; i >= L; i--)
s2 = s2 + s[i];
if (s1 == s2) return true;
else return false;
}
int main()
{
scanf("%s", s + 1); //Đọc dữ liệu vào mảng char, bắt đầu từ 1
n = strlen(s + 1); //Lấy độ dài của mảng, tính từ 1
f[1] = 1;
for (int i = 2; i<=n; i++) {
f[i] = f[i-1] + 1;
for (int j = i-1; j>= 1; j--)
if (s[i] == s[j])
if (check(j + 1, i - 1) == true)
f[i] = min(f[i], f[j-1] + 1);
}
cout << f[n];
return 0;
}