// #牛客春招刷题训练营# https://www.nowcoder.com/discuss/726480854079250432
// 又是看了题解才写出题目的一次,题解说染色问题优先想到dp
/*#include <iostream>
#include <string>
#include <vector>
#define pre(i, j, k) for (int i = j; i < k; i++)
using namespace std;
int main() {
ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
string s;
cin >> s;
char lc, rc;
int ans = 0;
size_t size = s.size();
int l = 0, r = s.size() - 1;
while(l < r){
while(l + 1 < size && s[l] == s[l + 1]) l++;
while(r - 1 > -1 && s[r] == s[r - 1]) r--;
if (l >= r){
ans++;
break;
}
if (s[l] == s[r]){
ans++;
l++;
r--;
}
else if (s[l] == s[r - 1] || s[l + 1] == s[r]){
ans++;
if (s[l] == s[r - 1]) r--;
else l++;
}
else
}
}
// 64 位输出请用 printf("%lld")*/
#include<iostream>
#include<algorithm>
#include<string>
#define pre(i,j,k) for(int i = j; i < k; i++)
using namespace std;
int dp[60][60];
int main(){
ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
string s;
cin >> s;
size_t size = s.size();
pre(len, 1, 1 + size){
pre(i, 0, size){
int j = i + len - 1;
if (j >= size) break;
dp[i][j] = 0x3f3f3f3f;//--------初始化,不然后面不能min
if (i == j) dp[i][j] = 1;//----------如果只有一个板子一个颜色那么就涂一次
else if (s[i] == s[j]) dp[i][j] = min(dp[i][j - 1], dp[i + 1][j]);//---------如果两端相等,可以让两端共用一次涂色
else {//----------否则枚举出最小
pre(k, i, j){
dp[i][j] = min(dp[i][k] + dp[k + 1][j], dp[i][j]);
}
}
}
}
cout << dp[0][size - 1];
return 0;
}