zoukankan      html  css  js  c++  java
  • 8633 回文划分(dp)

    8633 回文划分

    该题有题解

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

    题型: 编程题   语言: G++;GCC

     

    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
    



     

    题解

    dp题目,开一个数组ci存当前的最少回文子串数
    核心代码如下
    for (int i=0;i<len;i++)//从头扫到底
    {
    int mins=maxn;
    for (int j=0;j<=i;j++)
    {
    int t=0;
    if (if_hui(j,i))//判断是不是回文串
    {
    if (j>0) t=ci[j-1]+1;
    mins=min(mins,t);
    }
    }
    ci[i]=mins;//更新最小回文串数
    }
    最后输出ci[len-1]+1即可

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    char s[3000];
    int ci[3000];
    const int maxn=999999;
    int if_hui (int l,int r)
    {
         while(l<r){
                if(s[l]!=s[r]){
                    return 0;
                }
                ++l;
                --r;
            }
            return 1;
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%s",s);
            memset(ci,0,sizeof(ci));
            int len=strlen(s);
            for (int i=0;i<len;i++)
            {
                int mins=maxn;
                for (int j=0;j<=i;j++)
                {
                    int t=0;
                    if (if_hui(j,i))
                    {
                        if (j>0) t=ci[j-1]+1;
                        mins=min(mins,t);
                    }
                }
                ci[i]=mins;
            }
            printf("%d
    ",ci[len-1]+1);
        }
        return 0;
    }
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • 相关阅读:
    Ajax基本案例详解之$.getjson的实现
    Ajax基本案例详解之$.getjson的实现
    Ajax传递json数据
    Ajax传递json数据
    Ajax基本案例详解之load的实现
    多节点日志数据 数据集成
    crontab 问题分析
    不留文档的某某离开后 审计服务器操作历史
    /cloudmonitor.log 主机监控
    网关会对开发者的接口非业务调用错误做统一处理
  • 原文地址:https://www.cnblogs.com/scaugsh/p/5532552.html
Copyright © 2011-2022 走看看