首页 > 代码库 > UVA - 11584 Partitioning by Palindromes[序列DP]

UVA - 11584 Partitioning by Palindromes[序列DP]

UVA - 11584
Partitioning by Palindromes

We say a sequence of char- acters 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 charac- ters, we can always create a par- tition of these characters such that each group in the partition is a palindrome! Given this ob- servation it is natural to ask: what is the minimum number of groups needed for a given string such that every group is a palin- drome?

For example:

  • ‘racecar’ is already a palindrome, therefore it can be partitioned into one group.

  • ‘fastcar’ does not con- tain any non-trivial palin- dromes, so it must be par- titioned as (‘f’, ‘a’, ‘s’, ‘t’, ‘c’, ‘a’, ‘r’).

  • ‘aaadbccb’ can be parti- tioned as (‘aaa’, ‘d’, ‘bccb’).

    Input

Can you read upside-down?

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.

Sample Input

3racecarfastcaraaadbccb

Sample Output

1 7 3 


最少回文划分


 

f[i]表示到i的最少次数,随便一转移

判断回文:p[i][j]=p[i+1][j-1] if s[i]==s[j]

////  main.cpp//  uva11584////  Created by Candy on 10/18/16.//  Copyright © 2016 Candy. All rights reserved.//#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;typedef long long ll;const int N=1005,INF=1e9;inline int read(){    char c=getchar();int x=0,f=1;    while(c<0||c>9){if(c==-)f=-1;c=getchar();}    while(c>=0&&c<=9){x=x*10+c-0;c=getchar();}    return x*f;}int T,n;char s[N];int f[N],p[N][N];bool pal(int l,int r){    if(l>=r) return 1;    if(p[l][r]!=-1) return p[l][r];    if(s[l]==s[r]) p[l][r]=pal(l+1,r-1);    else p[l][r]=0;    return p[l][r];}void dp(){    memset(p,-1,sizeof(p));    f[0]=0;f[1]=1;    for(int i=2;i<=n;i++){        f[i]=INF;        for(int j=0;j<i;j++)            if(pal(j+1,i)) f[i]=min(f[i],f[j]+1);    }}int main(int argc, const char * argv[]) {    T=read();    while(T--){        scanf("%s",s+1);        n=strlen(s+1);        dp();        printf("%d\n",f[n]);    }    return 0;}

 

UVA - 11584 Partitioning by Palindromes[序列DP]