8633 回文划分[C]

8633 回文划分

该题有题解

时间限制:1000MS  内存限制:1000K
提交次数:169 通过次数:63

题型: 编程题   语言: C++;C

Description

    我们说一个字符串是回文串,那么意味着这个串从两边读起来的字母都是一样的。例如racecar是回文串,
然而fastcar则不是。
    对一个串的划分意思是将一个串划分为若干个部分。例如,racecar可以划分为race 和car两部分。给出
一个串,要把这个串划分为若干个回文串,那么至少要把这个串划分为多少部分?
例如
'racecar'已经是回文串,划分为1 个部分即可(这个部分就是racecar)。
'fastcar' 需要被划分为七个部分 ('f', 'a', 's', 't', 'c', 'a', 'r')。根据回文串的定义,单个字母也是回文串。
'aaadbccb' 分成可以被分为三个回文串 ('aaa', 'd', 'bccb')。找不到更少的划分方法。



输入格式

输入的第一行是数字T,表示输入文件含有T个CASE。之后有T行,每行有一个长度不大于1000的字
符串,全部由小写字母组成,中间没有空格。


输出格式

对于每个CASE,输出一个数字,表示对该字符串的回文串最小划分。


输入样例

3
racecar
fastcar
aaadbccb


输出样例

1
7
3


提示



来源

PKKJ @ 07 GIS 1

作者

admin


思路:这道题用到了DP算法(动态规划)。

解决这道题无法从整个字符串入手,只能从子字符串判断,然后把子字符串扩大到整个字符串,在判断的过程中要不断更新最小划分。

更新的方法要依据前面已经获得最优解去更新。看下图。



代码


#include <stdio.h>
#include <string.h>

char s[1005];

int is_plalindrome(int j,int i)
{
    for(;j<=i;j++,i--)
    {
        if(s[j]!=s[i])
        {
            return 0;
        }
    }
    return 1;
}

int main()
{
    int n,i,j,dp[1005],length;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",s);
        length=strlen(s);
        dp[0]=0;
        for(i=1;i<=length;i++)
        {
            for(j=1,dp[i]=1005;j<=i;j++)
            {
                if(is_plalindrome(j-1,i-1))
                {
                    if(dp[i]>dp[j-1]+1)
                    {
                        dp[i]=dp[j-1]+1;
                    }
                }
            }
        }

        printf("%d\n",dp[length]);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值