码迷,mamicode.com
首页 > 其他好文 > 详细

51Nod-1154 回文串划分

时间:2017-08-11 23:03:16      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:algo   ret   示例   ios   bsp   code   scanf   scan   划分数   

有一个字符串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]);
}

 



51Nod-1154 回文串划分

标签:algo   ret   示例   ios   bsp   code   scanf   scan   划分数   

原文地址:http://www.cnblogs.com/renjianshige/p/7348251.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!