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

UVA 11584 Partitioning by Palindromes DP

时间:2015-02-09 16:06:59      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:

题目链接

n2 的预处理i~j是不是回文串

然后 n2 的DP


11584 Partitioning by Palindromes

Can you read upside-down?
We say a sequence of characters is a
palindrome if it is the same written
forwards and backwards. For example,
‘racecar’ is a palindrome, but
‘fastcar’ is not.
A partition of a sequence of characters
is a list of one or more disjoint
non-empty groups of consecutive characters
whose concatenation yields the
initial sequence. For example, (‘race’,
‘car’) is a partition of ‘racecar’ into
two groups.
Given a sequence of characters, we
can always create a partition of these
characters such that each group in the
partition is a palindrome! Given this
observation it is natural to ask: what
is the minimum number of groups
needed for a given string such that every
group is a palindrome?
For example:
? ‘racecar’ is already a palindrome,
therefore it can be partitioned
into one group.
? ‘fastcar’ does not contain any
non-trivial palindromes, so it
must be partitioned as (‘f’, ‘a’,
‘s’, ‘t’, ‘c’, ‘a’, ‘r’).
? ‘aaadbccb’ can be partitioned as
(‘aaa’, ‘d’, ‘bccb’).

Input

Input begins with the number n of test cases. Each test case consists of a single line of between 1 and
1000 lowercase letters, with no whitespace within.

Output

For each test case, output a line containing the minimum number of groups required to partition the
input into groups of palindromes.Universidad de Valladolid OJ: 11584 – Partitioning by Palindromes 2/2

Sample Input

3
racecar
fastcar
aaadbccb

Sample Output

1
7
3


/* ***********************************************
Author        :CKboss
Created Time  :2015年02月09日 星期一 12时32分31秒
File Name     :UVA11584.cpp
************************************************ */

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>

using namespace std;

const int maxn=1111;

int n;
bool isP[maxn][maxn];
char str[maxn];
int dp[maxn];

void init()
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            int left=i-j,right=i+j;
            if(left>=0&&right<n)
            {
                if(str[left]==str[right])
                    isP[left+1][right+1]=true;
                else break;
            }
            else break;
        }
    }
    for(int i=0;i<n-1;i++)
    {
        int left=i,right=i+1;
        if(str[left]==str[right])
        {
            for(int j=0;j<n;j++)
            {
                left=i-j;
                right=i+1+j;
                if(left>=0&&right<n) ;
                else break;
                if(str[left]==str[right])
                    isP[left+1][right+1]=true;
                else break;
            }
        }
    }
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);

    int T_T;
    scanf("%d",&T_T);
    while(T_T--)
    {
        scanf("%s",str);
        n=strlen(str);
        memset(dp,63,sizeof(dp));
        memset(isP,0,sizeof(isP));
        init();
        dp[0]=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<i;j++)
            {
                if(isP[j+1][i]) 
                    dp[i]=min(dp[i],dp[j]+isP[j+1][i]);
            }
        }
        printf("%d\n",dp[n]);
    }

    return 0;
}

UVA 11584 Partitioning by Palindromes DP

标签:

原文地址:http://blog.csdn.net/ck_boss/article/details/43670803

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