zoukankan      html  css  js  c++  java
  • 51Nod-1154 回文串划分

    有一个字符串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
    输出最少的划分数量。
    Input示例
    abbaabaa
    Output示例
    3


    题解:
    这个题目,数据比较水,n^3可以过,首先,设dp[i]表示前i位的最少字符串数,所以dp[i]=min(dp[i],dp[j]+1)(j<i&&j+1~i是回文串),就是看前面一段用最优的,后面一段我们把他们用一个回文(如果可以的话)。


    代码
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<stdlib.h>
    #include<stdio.h>
    #define MAXN 5010
    using namespace std;
    char s[MAXN];
    bool can[MAXN][MAXN];
    int dp[MAXN];
    
    bool check(int x,int y){
        while(x!=y&&y>x){
            if(s[x]==s[y]) x++,y--;
            else return 0;
        }
        return 1;
    }
    
    int main(){
        scanf("%s",s+1);
        int n=strlen(s+1);
        memset(dp,127,sizeof(dp));
        dp[0]=0;
        for(int i=1;i<=n;i++)
            for(int j=0;j<i;j++){
                if(check(j+1,i)){
                    dp[i]=min(dp[i],dp[j]+1);
                }
            }
        printf("%d",dp[n]);
    }


  • 相关阅读:
    Java equals()和hashCode()重写总结
    常见ORM框架理解
    struts2的第一个小页面
    Java开发StringBuilder类
    “中软综合项目实训”——把学生当员工培养
    中软寻梦
    软件开发学习的5大技巧
    从学生心理入手
    IT技术人员的职业发展方向
    驱动创新 引领未来
  • 原文地址:https://www.cnblogs.com/renjianshige/p/7348251.html
Copyright © 2011-2022 走看看