#include <bits/stdc++.h> using namespace std; const int MAXN = 55; int dp[MAXN][MAXN]; int main() { string s;cin >> s; int n = s.size(); memset(dp,0x1,sizeof(dp));// 初始化dp数组,所有值设为一个较大的数 for(int i = 0; i < n; i++)dp[i][i] = 1;// 单个字符涂色需要1次操作 // for(int i = 0; i < n; i++) // { // for(int j = 0;j < n;j++) // { // if(dp[i][j] >= 16843009) cout << "0"; // else cout << dp[i][j]; // if(j!= n-1)cout << " "; // else cout << " |"; // }cout << endl; // } // cout << "-----------" << endl; //直接算两个字符的,一个字符的在上面弄过了 for (int len = 1; len < n; len++) { // 遍历所有可能的子串长度起点 for (int i = 0; i < n - len; i++) { int j = i + len;//终点 if (s[i] == s[j])dp[i][j] = min(dp[i][j-1], dp[i+1][j]);//处理回文特殊字串,判左小还是右 for(int k = i; k < j; k++) { dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);//枚举子串内最小值 } }//cout << endl; } // for(int i = 0; i < n; i++) // { // for(int j = 0;j < n;j++) // { // if(dp[i][j] >= 10000) cout << "0"; // else cout << dp[i][j]; // if(j!= n-1)cout << " "; // else cout << " |"; // }cout << endl; // } // cout << "-----------" << endl; cout << dp[0][n-1] << endl; return 0; }