zoukankan      html  css  js  c++  java
  • 回文串划分

    题目:

    有一个字符串S,求S最少可以被划分为多少个回文串。
    例如:abbaabaa,有多种划分方式。
     
    a|bb|aabaa - 3 个回文串
    a|bb|a|aba|a - 5 个回文串
    a|b|b|a|a|b|a|a - 8 个回文串
     
    其中第1种划分方式的划分数量最少。

    Input

    输入字符串S(S的长度<= 5000)。

    Output

    输出最少的划分数量。

    Sample Input

    abbaabaa

    Sample Output

    3

    分析:
    题目意思还是很好懂的,不像比赛的几个题目我连题意都没看懂,但是看懂了题目也不代表我就能AC。
    dp[i]是字符1~i划分成的最小回文串的个数,则有dp[i]=min{dp[i],dp[j]+1 | a[j+1~i]是回文串}
    可以先用O(n²)的时间判断s[i...j]是否为回文串。

    AC代码:
    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    char a[5005];
    int dp[5005];
    using namespace std;
    int deal(int w,int v)   //判断是否为回文串
    {
        int mid=v-(v-w)/2;  //取中点
        for (int i=w,j=v;i<=mid;i++,j--)
         if(a[i]!=a[j])
            return 0;
        return 1;
    }
    int main()
    {
        scanf("%s",a+1);
        int len=strlen(a+1);
        for (int i=1;i<=len;i++)
        {
            dp[i]=dp[i-1]+1;
            for (int j=0;j<i;j++)
            {
                if (deal(j+1,i)&&dp[i]>dp[j]+1)
                    dp[i]=dp[j]+1;
            }
        }
        cout << dp[len] << endl;
        return 0;
    }
     
  • 相关阅读:
    2.操作系统基础
    6.Linux基础3
    DRAM 内存介绍(一)
    131127新的一天
    Java中的super关键字何时使用
    JAVA的引用类型变量(C/C++中叫指针)
    System.out.println()的含义
    Java面试题
    HTML基础知识
    子域名查找
  • 原文地址:https://www.cnblogs.com/lisijie/p/7420101.html
Copyright © 2011-2022 走看看