题目描述
如果一个单词从前和从后读都是一样的,则称为回文字。如果一个单词不是回文字,则可以把它拆分成若干个回文字。编程求一个给定的字母序列,最多要分割成几部分,使每一部分都回文字。
输入格式
一行,包含一个字符串。字符串由小写英文字母组成(a-z),长度不超过100。
输出格式
一行,为最少的回文字个数。
输入样例
anaban
输出样例
2
题解
区间dp。先判断当前子串是否是回文串,不是的话直接合并即可。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <iostream> #include <algorithm> #include <cstdio> #include <cmath> #include <string> using namespace std; string s; int f[101][101]; bool flag; int main() { cin >> s; for(register int i = s.size() - 1; i >= 0; i--) { for(register int j = i; j < s.size(); j++) { flag = 1; for(register int k = i; k < i + (j - i + 1) / 2; k++) { if(s[k] != s[j - k + i]) { flag = 0; break; } } if(flag) { f[i][j] = 1; continue; } f[i][j] = 0xfffff; for(register int k = i; k < j; k++) { f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j]); } } } cout << f[0][s.size() - 1]; return 0; }