【题解】回文字

题目描述

  如果一个单词从前和从后读都是一样的,则称为回文字。如果一个单词不是回文字,则可以把它拆分成若干个回文字。编程求一个给定的字母序列,最多要分割成几部分,使每一部分都回文字。

输入格式

  一行,包含一个字符串。字符串由小写英文字母组成(a-z),长度不超过100。

输出格式

  一行,为最少的回文字个数。

输入样例

anaban

输出样例

2

 

题解

  区间dp。先判断当前子串是否是回文串,不是的话直接合并即可。

#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;
} 
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10805123.html