zoukankan      html  css  js  c++  java
  • 51Nod

    回文串划分

    有一个字符串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


    字符串dp。O(n^2)枚举中心点,向两边找相同字符,状态转移方程:dp[k]=min(dp[k],dp[j-1]+1)。

    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include<string>
    #include<map>
    #include<stack>
    #include<queue>
    #include<set>
    #include<algorithm>
    #define MAX 5005
    #define INF 0x3f3f3f3f
    #define MOD 1000000007
    using namespace std;
    typedef long long ll;
    
    int dp[MAX];
    
    int main()
    {
        int t,n,m,i,j,k;
        char s[MAX];
        scanf(" %s",s+1);
        int len=strlen(s+1);
        memset(dp,INF,sizeof(dp));
        dp[0]=0;
        for(i=1;i<=len;i++){
            for(j=i,k=i;0<j&&k<=len;j--,k++){
                if(s[j]==s[k]){
                    dp[k]=min(dp[k],dp[j-1]+1);
                }
                else break;
            }
            for(j=i,k=i+1;0<j&&k<=len;j--,k++){
                if(s[j]==s[k]){
                    dp[k]=min(dp[k],dp[j-1]+1);
                }
                else break;
            }
        }
        printf("%d
    ",dp[len]);
        return 0;
    }
  • 相关阅读:
    缓存(二)
    缓存
    SQL Server 导入大数据脚本
    C#执行OracleHelper
    MERGE 用法
    c# 高效读写文件
    C#网络编程
    C#常用IO流与读写文件
    注册asp.net 4.0 到iis
    javascript原生图片懒加载
  • 原文地址:https://www.cnblogs.com/yzm10/p/8878549.html
Copyright © 2011-2022 走看看